Domanda:
Query con più COUNT() in MYSQL?
anonymous
2011-09-18 12:24:13 UTC
Ciao ragazzi! Aiutatemi in questa query... praticamente il mio database modella il parlamento.
Ho due entità LEGGE e MINISTRO e una relazione N,N tra le due : VOTA.
Dentro a Vota c'è il voto di ogni ministro per ogni legge.
Voglio creare una query NON NIDIFICATA che mi dica per ogni legge quanti voti sono favorevoli, quanti astenuti e quanti contrari... è possibile farlo senza nidificazione? Io senza non ci riesco :(
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;

Dove sbaglio? Grazie anticipate
Tre risposte:
anonymous
2011-09-18 15:55:24 UTC
dalla tua descrizione (e di conseguenza dalla query postata) non riesco a capire lo schema del tuo database, se puoi postarlo in modo esteso posso aiutarti.

se ho capito bene stai tentando di fare 2 volte il join della stessa tabella con 2 nomi diversi ma non credo si possa fare :| come seconda cosa non capisco il join tra vota e ministro visto che ti serve solo il numero di voti e non il "proprietario", ricorda che la tabella vota contiene un record per ogni voto espresso.

purtroppo la soluzione piu' "elegante" (e l'unica percorribile cosi su due piedi) credo resti quella della query nidificata.
luke3745
2011-09-19 09:11:04 UTC
L'alternativa, senza modificare il db, sarebbe operare più query :



SELECT count(idlegge) FROM vota WHERE voto="Favorevole" GROUP BY idlegge;

SELECT count(idlegge) FROM vota WHERE voto="Contrario" GROUP BY idlegge;



sono più query, ma leggibili e veloci...
zedda_piras25
2011-09-19 08:14:10 UTC
il count conta il numero di righe e non può essere usato in questo modo



se la tabella vota fosse

idministro int,

idlegge int,

astenuto tinyint,

favorevole tinyint,

contrario tinyint,

...





dove il valore dei tre voti può essere 0 o 1 e la somma dei tre deve essere 1

allora ti basta un

select sum(astenuto), sum(favorevole), sum(contrario) from vota



ti occuperebbe anche meno spazio e sarebbe più ottimizzato rispetto ad un char50



normalmente dovresti usare un enum invece di un char ma ora non mi viene in mente una soluzione

di sicuro è più veloce di una query annidata


Questo contenuto è stato originariamente pubblicato su Y! Answers, un sito di domande e risposte chiuso nel 2021.
Loading...