PDA

View Full Version : [Mysql] consiglio su conteggio (anche in caso di 0 record)


Berseker86
05-11-2008, 20:10
Ciao a tutti, vi espongo un piccolo problema che ho con un progettino che sto facendo..

in pratica mi trovo ad avere due tabelle, una con una lista di clienti (e il loro id), l'altra con una lista di "prestiti", ognuno caratterizzato da un collegamento via chiave esterna all'id del cliente medesimo..

ebbene, vorrei visualizzare una tabella del tipo

| Nome cognome cliente | Numero Prestiti in atto |

e ce l'avrei anche fatta, l'unico problema è che non appaiono i nomi dei clienti che in quel momento non hanno nessun prestito, io invece vorrei che apparissero nella lista con uno "0" nella colonna numero prestiti. Se qualcuno può darmi una mano.. grazie mille

Kralizek
05-11-2008, 20:22
Ciao a tutti, vi espongo un piccolo problema che ho con un progettino che sto facendo..

in pratica mi trovo ad avere due tabelle, una con una lista di clienti (e il loro id), l'altra con una lista di "prestiti", ognuno caratterizzato da un collegamento via chiave esterna all'id del cliente medesimo..

ebbene, vorrei visualizzare una tabella del tipo

| Nome cognome cliente | Numero Prestiti in atto |

e ce l'avrei anche fatta, l'unico problema è che non appaiono i nomi dei clienti che in quel momento non hanno nessun prestito, io invece vorrei che apparissero nella lista con uno "0" nella colonna numero prestiti. Se qualcuno può darmi una mano.. grazie mille
provato con un outer join? ;)

Berseker86
05-11-2008, 20:31
provato con un outer join? ;)
ti ringrazio della dritta, ora vado a informarmi meglio su questa outer join.. ;)

Kralizek
05-11-2008, 20:38
ti ringrazio della dritta, ora vado a informarmi meglio su questa outer join.. ;)

figurati, se non trovi niente chiedi pure...

Berseker86
05-11-2008, 20:56
rieccomi, perchè nonostante abbia cercato di utilizzare questa left outer join, non riesco a fare quello che vorrei. Preciso meglio il mio problema.

Tabella Clienti
Id (primary key)
Nome
Cognome

Tabella Prestiti
Id
Id_cliente
id_libro
data_inizio
data_fine


io voglio una tabella che mi dia una lista dei clienti (TUTTI) e il numero dei prestiti che hanno in corso (cioè quelli con la data_fine "NULL"), eventualmente con un numero pari a 0 se in questo momento non hanno prestiti in atto.
ho provato con
SELECT nome, cognome, count(*) as numero_prestiti FROM cliente LEFT OUTER JOIN prestiti ON
cliente.id = prestiti.id_cliente WHERE data_fine IS NULL GROUP BY cliente.id;

ma non mi escono 2 dei 7 clienti che ho attualmente nella tabella clienti, proprio quelli che effettivamente non hanno nessun prestito attivo (ne hanno qualcuno, ma già concluso (con data_fine NON NULL).

Kralizek
05-11-2008, 21:48
Qualcosa tipo:

SELECT C.Nome, C.Cognome, COUNT(P.ID) AS Prestiti
FROM Clienti AS C LEFT JOIN Prestiti AS P ON C.ID = P.ID_Cliente
GROUP BY C.Nome, C.Cognome, P.ID

ti salta le righe vuote?

Mixmar
05-11-2008, 21:58
ma non mi escono 2 dei 7 clienti che ho attualmente nella tabella clienti, proprio quelli che effettivamente non hanno nessun prestito attivo (ne hanno qualcuno, ma già concluso (con data_fine NON NULL).

Credo che la soluzione stia nella tua ultima frase, e nel fatto che tu applichi la clausola "WHERE data_fine IS NULL": a causa della left join, la tua tabella contiene anche i clienti che non hanno prestiti, però la clausola where filtra di nuovo via proprio quelli, quindi non te li ritrovi più nel risultato finale.

Ecco la prima idea che mi viene in mente (forse non è la più "furba", ma dovrebbe funzionare):


(SELECT nome, cognome, count(*) as numero_prestiti FROM cliente LEFT OUTER JOIN prestiti ON
cliente.id = prestiti.id_cliente WHERE data_fine IS NULL GROUP BY cliente.id)
UNION
(SELECT nome, cognome, 0 as numero_prestiti FROM cliente WHERE cliente.id NOT IN
(SELECT prestiti.id_cliente WHERE data_fine IS NULL)
GROUP BY cliente.id);


In pratica ho spezzato la query in due query distinte unite da "UNION", la prima è la tua vecchia query, che da un elenco di tutti i clienti con prestiti attivi e il numero dei loro prestiti, eliminando dal conteggio tutti i prestiti già finiti. La seconda query trova tutti gli utenti che non hanno prestiti in corso, semplicemente scegliendo tutti i clienti il cui id non è mai associato ad un prestito in corso, cioè tutti quelli che non hanno prestiti in corso.

Però non mi ricordo se la sintassi per inserire un campo costante sia quella (lo "0" che ho messo in cima).

Naturalmente il risultato non è molto ordinato, ma questo lo puoi sistemare eventualmente in seguito.

Berseker86
06-11-2008, 07:50
ho trovato la soluzione! :winner: (modificando un po' la query suggerita da Kralizek)
:read:

SELECT nome, cognome, COUNT(prestiti.id) as Prestiti FROM cliente LEFT JOIN prestiti ON cliente.id = prestiti.id_cliente AND data_fine IS NULL GROUP BY cliente.id;

mi restituisce correttamente la lista dei clienti, compresi quelli con 0 prestiti!
grazie mille a tutti quelli che mi hanno indirizzato verso la retta via!