Newsgroup: it.comp.www.php
Titolo: PHP/MySQL join delle tabelle... HELP!!!!

Salve,
Mi chiedevo se qualcuno può darmi un aiuto su questo problema:
Sto facendo un programma di statistiche per siti web (che sarà open source
ovviamente!).
Una caratteristrica di questo programma è la possibilità di monitorare più
pagine e di avere le statistiche relative sia a tutti i dati registrati sia
alle pagine singole monitorate.
Per ogni pagina monitorata viene creata automaticamente (controllando se la
pagina risulta presente o meno in un index delle pagine monitorate) una
tabella in mysql.
Esempio:
[database]
          |
          [page0]=>
http://nomesito.it/index.html
          [page1]=>
http://nomesito.it/cani.html
          [page2]=>
http://nomesito.it/gatti.html
Ora, per avere logs e statistiche di una pagina singola (ad esempio quella
di cui i dati sono registrati nella tabella page0) basta fare una query al
database del tipo:
SELECT  *  FROM page0 WHERE elemento='elemento'
Il problema sorge quando voglio prendere i dati da tutte le tabelle del
database per estrarre delle statistiche; ho provato ad usare:
SELECT  *  FROM page0,page1,page2 WHERE elemento='elemento'
ma non funziona! Quando in PHP vado a fare un while mysql_fetch_array (o
row) per
elaborare i dati, questi risultano sfalsati (in qualche modo ripetuti n
volte).
Ho temporaneamente risolto la cosa in questo modo:
1) Accedo all'index di corrispondenza fra pagine e nomi di tabelle
 ed inserisco in un array i nomi delle tabelle.
2) Per ogni elemento dell'array creato eseguo un while (mysql_fetch_array
(query)) dove query (supponendo di voler estrarre i dati per i browsers) è
un "SELECT DISTINCT browser FROM $stat_pag e successivamente interrogo il
database sul numero di righe rese per ogni elemento distinto reso dalla
prima query.
per ogni ciclo memorizzo il risultato in un array associativo a cui sommo i
risultati del ciclo successivo.
3) Al termine dell'operazione ottengo un array associativo che contiene
tutti i dati
elaborati:
    $browsers[Explorer 6]= "142"
    $browsers[Netscape 4]= "92"
    $browsers[Konqueror]= "43"
    $browsers[Mozzilla 1]= "35"
Oltre ad essere un metodo a mio avviso molto dispendioso, risulta molto
seccante da applicare per ogni ricerca di tipo diverso da quella globale e
da integrare nelle varie funzioni in cui potrei averne bisogno.
L'ideale sarebbe poter fare una query che senza troppe elaborazioni (ed in
un colpo solo) mi renda tutti i logs contenuti nel database.
Una cosa tipo:
SELECT  *  FROM page0,page1,page2
Purtroppo, come ho detto, questa formula non funziona correttamente.
So che è possibile fare un JOIN delle tabelle, cioè trattare più tabelle
come una tabella unica composta dagli append delle tabelle che la
compongono.
Come devo agire per ottenere un risultato simile?
Grazie a chi mi potrà aiutare. :-)
Sandro Piludu


Ti da i record combinati, con uno schema dove il risultato è composto
da tutti i risultati della tabella A abbinati a B
Se A è composto da 4 record:
Inter
Juventus
Milan
Roma
E B dagli stessi record una queery del tipo
Select * from A,B  where A.nome<>B.nome ottieni il calendario degli
incontri di un torneo........
Io ho fatto una cosa simile, ma ho messo il riferimento alla pagina
non com ese fosse una tabella ma come campo di una tabella di log
Pagina | Ip | Data | Parametri |Agent|
Se voglio sapere il numero di accessi al sito conto gli accessi a
homepage
Se volgio combinarli devo solo mettere una clausola where Pagina =
appropriata
Altrimenti, nel tuo caso, potresti fare una select per ciascuna
pagina, trasformare ilr ecordset in un array e unirlo
Saluti
Andrea

 compongono.
sai male. una join non è una append ma un prodotto:
mysql> select * from prova;
+--------+--------+
| campo1 | campo2 |
+--------+--------+
| 1      | 2      |
| 5      | 6      |
+--------+--------+
2 rows in set (0.06 sec)
mysql> select * from prova2;
+--------+--------+
| campo3 | campo4 |
+--------+--------+
| 3      | 4      |
| 7      | 8      |
+--------+--------+
2 rows in set (0.00 sec)
mysql> select * from prova, prova2;
+--------+--------+--------+--------+
| campo1 | campo2 | campo3 | campo4 |
+--------+--------+--------+--------+
| 1      | 2      | 3      | 4      |
| 5      | 6      | 3      | 4      |
| 1      | 2      | 7      | 8      |
| 5      | 6      | 7      | 8      |
+--------+--------+--------+--------+
4 rows in set (0.01 sec)
sotto altri database (like oracle) ci sono comandi di 'UNION' che 
'appendono' come vorresti.
nel tuo caso hai 2 soluzioni:
1 - fai n queries per n tabelle e le elabori ogni volta
(meglio)
2 - fai 3 insert dei campi che ti servono in un tabellone temporaneo e poi 
usi una sola query
(peggio)
ciao
-- 
Punkarruso
mail:punkarruso chiocchiolona despammed punto com
pubblicità progresso:
http://www.php.net

 o qualcosa di simile
...come confondere le idee con un problema che poi è un altro se leggevi il 
post fino in fondo...
-- 
Punkarruso
mail:punkarruso chiocchiolona despammed punto com
pubblicità progresso:
http://www.netmeister.org/news/learn2quote.html

Ciao, andrea!
In quel dě del Fri, 13 Sep 2002 09:45:31 +0200 hai scritto:
 a> Ti da i record combinati, con uno schema dove il risultato č composto
 a> da tutti i risultati della tabella A abbinati a B
 a> Se A č composto da 4 record:
 a> Inter
 a> Juventus
 a> Milan
 a> Roma
 a> E B dagli stessi record una queery del tipo
 a> Select * from A,B  where A.nome<>B.nome ottieni il calendario degli
 a> incontri di un torneo........
Sě, avevo notato che quel comando effettuava delle combinazioni fra i dati
(non avevo approfondito in che modo le effettuasse dato che non era la
soluzione al mio problema... ma comunque grazie lo stesso - un'informazione
da mettere in archivio! ^__^)
 a> Io ho fatto una cosa simile, ma ho messo il riferimento alla pagina
 a> non com ese fosse una tabella ma come campo di una tabella di log
 a> Pagina | Ip | Data | Parametri |Agent|
 a> Se voglio sapere il numero di accessi al sito conto gli accessi a
 a> homepage
 a> Se volgio combinarli devo solo mettere una clausola where Pagina =
 a> appropriata
Nella prima versione avevo fatto anch'io cosě, ma poi ho cambiato
impostazione usando una tabella per pagina perché mi sembrava eccessivo
scorrere tutto il database alla ricerca delle pagine singole (se controllo
100 pagine ed ho un numero di accessi molto elevato per ogni pagina...???).
E' comunque una soluzione valida e da prendere in considerazione se si
intende limitare l'uso del programma a siti medio/piccoli.
 a> Altrimenti, nel tuo caso, potresti fare una select per ciascuna
 a> pagina, trasformare ilr ecordset in un array e unirlo
E' quello che faccio attualmente infatti. :-)
 a> Saluti
 a> Andrea
Saluti anche a te, sei stato molto gentile. :-D
Sandro

Ciao, gabry!
In quel dě del Fri, 13 Sep 2002 09:54:39 +0200: hai scritto
[CUT]
 g> devi usare la select copi joiN  (CK campo Chiave)"
 g> SELECT  *  FROM page0,page1,page2 where (page0.CK=page1.CK) and
 g> (page1.CK =
 g> page2.CK)
 g> o qualcosa di simile ciao e spero di esserti stato di aiuto!!!!
 g> Gabry
Grazie per la risposta, ma cosě andrei a pescare solo i dati comuni a tutte
le tabelle se ho capito bene il significato della query. (e poi come si
comporterebbe il prodotto??? A me servono i dati di tutte le righe di ogni
tabella, appesi uno dopo l'altro.)
Grazie lo stesso per il tuo interessamento.
Ciao,
Sandro

Ciao, punkarruso!
In quel dì del Fri, 13 Sep 2002 07:46:44 GMT: hai scritto
 p> il sapiente Macchianera dice:
 >> So che è possibile fare un JOIN delle tabelle, cioè trattare più
 >> tabelle come una tabella unica composta dagli append delle tabelle
 >> che la compongono.
 p> sai male. una join non è una append ma un prodotto:
[CUT]
 p> sotto altri database (like oracle) ci sono comandi di 'UNION' che
 p> 'appendono' come vorresti.
Grazie per il chiarimento. :-)
 p> nel tuo caso hai 2 soluzioni:
 p> 1 - fai n queries per n tabelle e le elabori ogni volta (meglio)
(Quello che faccio già ora...)
 p> 2 - fai 3 insert dei campi che ti servono in un tabellone temporaneo
 p> e poi  usi una sola query (peggio)
Certo, farei operazioni in più...  grazie per l'aiuto!
Ciao,
Sandro

il sapiente Macchianera dice:

per il quoting usa solo '> ', senza spazi prima ma con uno dopo.
le motivazioni qui:
http://www.netmeister.org/news/learn2quote.html
ciao
-- 
Punkarruso
mail:punkarruso chiocchiolona despammed punto com
pubblicità progresso:
http://www.gnu.org/philosophy/no-word-attachments.it.html