Query con più count() | SQL & MySQL

Topic: Pubblico - Composto da 3 Posts di 2 Utenti.

18 Settembre, 2011 21:22 #1
OltreLeStelle
Utente

OltreLeStelle
Registrato: Aug, 2011
Posts: 11
Offline

Mi servirebbe un aiuto per questa query... praticamente il mio database modella il parlamento.
Ho due entità LEGGE e MINISTRO e una relazione N,N tra le due di nome VOTA.
Dentro a Vota c'è il voto di ogni ministro per ogni legge.
Voglio creare una query NON NIDIFICATA (cosi chiede esplicitamente il testo) che mi dica per ogni legge quanti voti sono favorevoli, quanti astenuti e quanti contrari... è possibile farlo senza nidificazione? Io riesco solamente a farlo mettendo una subquery nella from (cosi è nidificata giusto?)
Ho buttato giù una cosa del genere ma non funziona :

SELECT v.idlegge, count(V.voto), count(V1.voto)
FROM vota V RIGHT JOIN ministro M ON V.idministro=M.idministro, vota V1 RIGHT JOIN ministro M1 ON V1.idministro=M1.idministro
WHERE V.voto="Favorevole" AND V1.Voto="Contrario"
GROUP BY v.idlegge;

Però non funziona...
EDIT :
Notavo che effettivamente posso usare la sola tabella vota in quanto non mi interessano i ministri scrivendo :

SELECT v.idlegge, count(all V.voto) Favorevoli, count(all V1.voto) Contrari, count(all V2.voto) Astenuti
FROM vota V, vota V1, vota V2
WHERE V.voto="Favorevole" and V1.Voto="Contrario" and V2.Voto="Astenuti"
GROUP BY v.idlegge
Ma non funziona neanche cosi...
Dove sbaglio? Grazie anticipate

Ultima modifica 19 Settembre, 2011 05:49 di OltreLeStelle

19 Settembre, 2011 12:42 #2
fuser
Utente

fuser
Registrato: Aug, 2011
Posts: 86
Offline

Che strano esercizio. Per ogni legge devi estrarre un solo record o puoi estrarne 3? Perchè in questo caso basta GROUP BY:

1SELECT count(*) FROM vota GROUP BY v.id_legge, v.voto

19 Settembre, 2011 12:49 #3
fuser
Utente

fuser
Registrato: Aug, 2011
Posts: 86
Offline

Però mi viene in mente che, per avere tutto in un record, se proprio non puoi usare le subquery, puoi fare:

1SELECT count(favorevoli.voto), count(astenuti.voto), count(contrari.voto)
2FROM (voto favorevoli JOIN voto astenuti ON favorevoli.idlegge = astenuti.idlegge) 
3JOIN voto contrari ON favorevoli.idlegge = contrari.idlegge
4WHERE favorevoli.voto = 'favorevole' AND astenuti.voto = 'astenuto' AND contrari.voto = 'contrario'
5GROUP BY favorevoli.idlegge;

Nota che potresti anche spostare le tre condizioni della WHERE nella ON, che magari è più chiaro per un essere umano, anche se forse rallenta un pochino.

Ultima modifica 19 Settembre, 2011 12:51 di fuser

Condividi su:

Loggati o Registrati per replicare