Newsgroup: it.comp.www.php
Titolo: Come ottenere una tabella (esempio nel msg) dai dati di un DB MySQL

Ho un DB così fatto:
CREATE TABLE `session` (
   `id_user` int(11) NOT NULL,
   `pageview` int(11) NOT NULL,
   `data` date NOT NULL default '0000-00-00',
   UNIQUE KEY `comp` (`id_user`,`data`)
) ENGINE=MyISAM;
che contiene questo genere di dati:
|---------|------------|------------|
| ID_USER |  PAGEVIEW  |    DATA    |
|---------|------------|------------|
|   3     |    12      | 2009-01-20 |
|---------|------------|------------|
|   3     |    23      | 2009-01-19 |
|---------|------------|------------|
|   3     |     5      | 2009-01-16 |
|---------|------------|------------|
|   4     |     9      | 2009-01-20 |
|---------|------------|------------|
|   4     |    18      | 2009-01-17 |
|---------|------------|------------|
|   4     |    14      | 2009-01-14 |
|---------|------------|------------|
|   5     |    11      | 2009-01-20 |
|---------|------------|------------|
|   5     |     8      | 2009-01-19 |
|---------|------------|------------|
|   5     |     7      | 2009-01-18 |
|---------|------------|------------|
|   5     |    22      | 2009-01-17 |
|---------|------------|------------|
|   5     |    30      | 2009-01-16 |
|---------|------------|------------|
|   5     |     5      | 2009-01-15 |
|---------|------------|------------|
|   5     |    19      | 2009-01-14 |
|---------|------------|------------|
Vorrei estrapolare i dati e presentarli in questo modo, creando cioè una tabella con i dati relativi agli
ultimi 7 giorni (escluso quello di consultazione):
|------|------------|------------|------------|------------|------------|------------|------------|------------|
| USER | 2009-01-20 | 2009-01-19 | 2009-01-18 | 2009-01-17 | 2009-01-16 | 2009-01-15 | 2009-01-14 |   TOTALE   |
|------|------------|------------|------------|------------|------------|------------|------------|------------|
|  3   |     12     |     23     |     --     |     --     |      5     |     --     |     --     |     40     |
|------|------------|------------|------------|------------|------------|------------|------------|------------|
|  4   |      9     |     --     |     --     |     18     |     --     |     --     |     14     |     41     |
|------|------------|------------|------------|------------|------------|------------|------------|------------|
|  5   |     11     |      8     |      7     |     22     |     30     |      5     |     16     |     99     |
|------|------------|------------|------------|------------|------------|------------|------------|------------|
È un esempio, i dati reali sono in numero maggiore e non posso sapere a priori quanti utenti ci sono.
Ogni aiuto è ben accetto

 È un esempio, i dati reali sono in numero maggiore e non posso sapere a priori quanti utenti ci sono.
per quanto riguarda la generazione della tabella non vedo grosse
complicazioni, con la query estai tutti i dati relativi agli ultimi 7
giorno,per farlo basta una 
select * from session where DATE_SUB(CURDATE(),INTERVAL 7 DAY)<=data
Fatta la query mettere i dati dentro ad una tabella è un attimo. 
Per quanto riguarda il discorso che non sai quanti utenti potresti avere,
datti un' occhiata alle tecniche di paginazione (in rete trovi n-mila
howto)
ciao
-- 
Web marketing & community management:
http://www.insistema.com/

RedWiz ha scritto:

Il problema non è l'estrazione dei dati dal DB, ma la generazione della 
tabella. Non so come gestire (in PHP) i dati che ottengo dalla query.
Cerco di spiegarmi meglio. Non so quanti dati relativi ad un utente 
trovo per le date che sto cercando (potrebbero non essere presenti dei 
dati di un utente relativi ad una o più date cercate).
Io userei un ciclo FOR (o WHILE) per inserire i dati nella tabella, ma 
come faccio a discriminare i dati stessi non essendo il numero dei dati 
di una riga costante?
Se fossero presenti i dati di tutte le giornate farei qualcosa del 
genere (giusto per far capire cosa intendo):
echo "<tr>";
for ($i = 0; $i < 7; $i++) {
	echo "<td>."$row['pageview']."</td>";
}
echo "</tr>";
Ma non sapendo quanti record sono relativi ad un utente non so come fare ...
Grazie comunque per la risposta :)
Excalibur

 fare ...
azzardo, ma magari ho letto male:
$ris = mysql_query("SELECT ....");
while($row = mysql_fetch_assoc($ris)) {
   echo "<td>".$row["campo"]."</td>";
}
Enrico

Enrico Bassetti ha scritto:

Non credo funzioni. faccio un esempio pratico:
supponiamo sia il 2009-01-21 e prendiamo i dati relativi ad un utente:
id 	page 	data
3 	38 	2009-01-19
3 	9 	2009-01-18
3 	15 	2009-01-16
3 	5 	2009-01-15
Quello che devo ottenere a video è questo:
----------------------------------------------------------------------------------------------------------
| user | 2009-01-20 | 2009-01-19 | 2009-01-18 | 2009-01-17 | 2009-01-16 | 2009-01-15 | 2009-01-14 | Tot. |
----------------------------------------------------------------------------------------------------------
|  3   |     --     |     38     |      9     |     --     |     15     |      5     |     --     |  67  |
----------------------------------------------------------------------------------------------------------
il mio problema è come generare la riga, inserendo i "--" dove non ci sono dati.
Spero di essere stato chiaro :)
Alfredo

allora
soluzione 1 (vedi tu sei ti pul andare bene) tabella pivot in excel
soluzione 2
    purtroppo con mysql con puoi fare una view con sorgente dati una select 
(giusto per intenderci select a.* from (select from) a)
    farei:
    insert into nuova_tavola(utente,gg-6,gg-5,gg-4,ecc.)
    select a.id_user
   ,(select count(*) from id_user b where a.id_user = b.id_user and a.data = 
today -6) gg-6
   ,(select count(*) from id_user b where a.id_user = b.id_user and a.data = 
today -5) gg-5
    ,ecc.
    from (select distinct id_user from session where data between today and 
today - 6 ) A
occhio che č sbagliato le funzioni di data le sistemi poi tu... con i 
periodi che devi gestire.. giusto per farti capire
la  (select distinct id_user from session where data between today-1 and 
today - 7) A
mi fa la distinct degli utenti nel periodo e la gestisci come se fosse un 
vista
poi ti fai le 7 subselect
attendo a mettere le coalesce per gestirti il null
il totale degli utenti o te lo fai con uan subselect o lo gestisci da 
programi in quanto hai i 7 dati.. devo solo sommarli.. (quind attento ai 
null)
se vuoi puoi fare una vista logica, soluzione che preferisco ma non puoi una 
la formula select from (select ..)
devi priam farti una vista con la (select distinct id_user from session 
where data between today and today - 6 ) A
poi una seconda vista con il risultato
lo farei fare al db e non a php..
attendo ai giusti indici, in funzione del volume dei dati
m@
a disposizione
"Excalibur" <exca...@REMOVEMEfastwebnet.it> ha scritto nel messaggio 
news:gl50jg$rhr$1...@serv1.iunet.it...
Ho un DB cosě fatto:



Vorrei estrapolare i dati e presentarli in questo modo, creando cioč una 
tabella con i dati relativi agli
ultimi 7 giorni (escluso quello di consultazione):
|------|------------|------------|------------|------------|------------|------------|------------|------------|
| USER | 2009-01-20 | 2009-01-19 | 2009-01-18 | 2009-01-17 | 2009-01-16 | 
2009-01-15 | 2009-01-14 |   TOTALE   |
|------|------------|------------|------------|------------|------------|------------|------------|------------|
|  3   |     12     |     23     |     --     |     --     |      5 
|     --     |     --     |     40     |
|------|------------|------------|------------|------------|------------|------------|------------|------------|
|  4   |      9     |     --     |     --     |     18     |     --  
|     --     |     14     |     41     |
|------|------------|------------|------------|------------|------------|------------|------------|------------|
|  5   |     11     |      8     |      7     |     22     |     30     | 
5     |     16     |     99     |
|------|------------|------------|------------|------------|------------|------------|------------|------------|
Č un esempio, i dati reali sono in numero maggiore e non posso sapere a 
priori quanti utenti ci sono.
Ogni aiuto č ben accetto 

Alla fine sono riuscito a risolvere. Il codice PHP non sarà il massimo ( :P) ma l'importante
è il risultato.
Ecco il codice (l'array $user contiene gli ID degli utenti):
    echo "<table cellspacing=2 cellpadding=2 align='center' border='1'";
    echo "<tr><td>USER ID</td>";
    for ($i = 7; $i > 0; $i--){
          echo"<td>".$max_data[$i]."</td>";
    }
    for ($i = 0; $i < count($user); $i++){
        echo "<tr><td>".$user[$i]."</td>";
        $sql1 = "SELECT pageview,data FROM session
                WHERE DATE_SUB(CURDATE(),INTERVAL 7 DAY)<=data AND id_user = ".$user[$i]."
                ORDER BY data DESC";
        $result1 = mysql_query($sql1) or DIE(mysql_error());
        $output1 ="";
        $output2 ="";
        $output3 ="";
        $output4 ="";
        $output5 ="";
        $output6 ="";
        $output7 ="";
        $totale = 0;
        for ($j = 0; $j <= mysql_num_rows($result1); $j++){
            $row1 = mysql_fetch_assoc($result1);
            if ($row1['data'] == $max_data[7] AND $output1 == "") {
                $output1 = "<td>".$row1['pageview']."</td>";
                $totale = $row1['pageview'];
            }elseif ($row1['data'] == $max_data[6] AND $output2 == "") {
                $output2 = "<td>".$row1['pageview']."</td>";
                $totale += $row1['pageview'];
            }elseif ($row1['data'] == $max_data[5] AND $output3 == "") {
                $output3 = "<td>".$row1['pageview']."</td>";
                $totale += $row1['pageview'];
            }elseif ($row1['data'] == $max_data[4] AND $output4 == "") {
                $output4 = "<td>".$row1['pageview']."</td>";
                $totale += $row1['pageview'];
            }elseif ($row1['data'] == $max_data[3] AND $output5 == "") {
                $output5 = "<td>".$row1['pageview']."</td>";
                $totale += $row1['pageview'];
            }elseif ($row1['data'] == $max_data[2] AND $output6 == "") {
                $output6 = "<td>".$row1['pageview']."</td>";
                $totale += $row1['pageview'];
            }elseif ($row1['data'] == $max_data[1] AND $output7 == "") {
                $output7 = "<td>".$row1['pageview']."</td>";
                $totale += $row1['pageview'];
            }
        }
        if ($output1 == "") $output1="<td align ='center'>--</td>";
        if ($output2 == "") $output2="<td align ='center'>--</td>";
        if ($output3 == "") $output3="<td align ='center'>--</td>";
        if ($output4 == "") $output4="<td align ='center'>--</td>";
        if ($output5 == "") $output5="<td align ='center'>--</td>";
        if ($output6 == "") $output6="<td align ='center'>--</td>";
        if ($output7 == "") $output7="<td align ='center'>--</td>";
        echo $output1.$output2.$output3.$output4.$output5.$output6.$output7;
        echo"<td>".$totale."</td><td>".intval($totale/7)."</td></tr>";
     }
     echo "</table>";
}
Grazie a tutti quelli che hanno risposto :)
Alfredo