PDA

Visualizza la versione completa : Estrazione da più tabelle


Nando
23-05-2009, 16:43
E' da ore che ci sbatto la testa ma non sono riuscito a trovare una soluzione, ho una tabella chiamata apparati con i campi: id_apparato, seriale, modello e un'altra chiamata manutenzioni con i campi: id_apparato(chiave esterna), data_manutenzione, tecnico. Per ogni record della tabella apparati corrispondono + di 2 record nella tabella manutenzioni.

Il risultato che vorrei ottenere se possibile è, che alla stampa di ogni record della tabella1 mi dica anche la data dell'ultima manutenzione effettuata su quell'apparato.

Per esempio: il modello 557 ha avuto le seguenti manutenzioni, il 10/2/09, il 22/4/09 e il 3/5/09, il risultato dovrà essere: id_apparato: 1, seriale: 5570034, ultima manutenzione effettuata: 3/5/09.

Non so se sono stato chiaro.

Grazie,
ciao.

Gopher
24-05-2009, 16:51
Prova qualcosa del genere:

SELECT t1.id_apparato, t1.seriale, t2.MAX(data_manutenzione) FROM apparati t1, manutenzioni t2 GROUP BY t1.id_apparato

Non ho testato, ma dovrebbe dare il risultato che vuoi tu..

Nando
24-05-2009, 19:19
Perfettamente funzionante, grazie.

Ciao.

Nando
08-06-2009, 15:24
Purtroppo ho dovuto spostare tutto su PostgreSQL e la query che mi hai dato non funziona, come mai ? mi esce fuori questo errore:

Query failed: ERROR: column "t_apparati.ckin" must appear in the GROUP BY clause or be used in an aggregate function :confuso:

Gopher
09-06-2009, 13:56
Che cosa contiene quel campo? E' intera? Insomma..fammi sapere cosa dovrebbe esserci dentro..l'errore è chiaro: deve essere usata solo con funzioni di aggregazione o come condizione GROUP BY..

Nando
09-06-2009, 15:04
Il campo è un intero, se provo a toglierlo il problema passa sul secondo campo e così via.

Gopher
09-06-2009, 15:12
Copia l'intera query

Nando
09-06-2009, 16:12
Eccoti la query:

SELECT t_apparati.id_apparato, t_apparati.ckin, t_apparati.sn_sab, t_apparati.sn_arcdata, t_apparati.sn_ier, t_apparati.modello, MAX(t_manutenzioni.data_manutenzione) AS data
FROM t_apparati LEFT JOIN t_manutenzioni ON t_apparati.id_apparato = t_manutenzioni.id_apparato
WHERE modello = '" . $_GET['mod'] . "'
GROUP BY t_apparati.id_apparato;

Gopher
10-06-2009, 00:47
Ok..allora fai così:

SELECT t_apparati.id_apparato, t_apparati.ckin, t_apparati.sn_sab, t_apparati.sn_arcdata, t_apparati.sn_ier, t_apparati.modello, MAX(t_manutenzioni.data_manutenzione) AS data
FROM t_apparati LEFT JOIN t_manutenzioni ON t_apparati.id_apparato = t_manutenzioni.id_apparato GROUP BY t_apparati.id_apparato WHERE modello = '" . $_GET['mod'] . "';

Se spostando il GROUP BY sopra invece che sotto va, abbiamo trovato il problema..altrimenti fai:

SELECT t_apparati.id_apparato, t_apparati.ckin, t_apparati.sn_sab, t_apparati.sn_arcdata, t_apparati.sn_ier, t_apparati.modello, MAX(t_manutenzioni.data_manutenzione) AS data
FROM t_apparati LEFT JOIN t_manutenzioni ON t_apparati.id_apparato = t_manutenzioni.id_apparato GROUP BY t_apparati.id_apparato, t_apparati.ckin, t_apparati.sn_sab, t_apparati.sn_arcdata, t_apparati.sn_ier, t_apparati.modello WHERE modello = '" . $_GET['mod'] . "';