2013-09-02 4 views
10

Okay, ho 2 tabelle:SQL unisce una relazione uno a molti - conta il numero di voti per immagine?

images       votes 
----------------------------  -------------------- 
image_id | name | square_id  vote_id | image_id 
----------------------------  -------------------- 
1   someImg 14   1   45 
2   newImg  3   2   18  
3   blandImg 76   3   1 
...        ... 
n        n 

questo è un uno a molti. Ogni immagine può avere più voti, ma un voto può essere associato solo a un'immagine. Sto cercando di produrre una query di join che mostrerà l'id immagine e il numero di voti che ha in una condizione specificata (ad esempio, in base a square_id). Così il risultato della query sarà simile a questo:

query_result 
---------------------- 
image_id | vote_count 
---------------------- 
18   46 
26   32 
20   18 
... 
55   1 

Ma il meglio che posso fare è questo:

query_result 
---------------------- 
image_id | vote_id 
---------------------- 
18   46 
18   45 
18   127 
26   66 
26   43 
55   1 

vedere il problema? Ogni image_id è elencato più volte per ogni vote_id che ha. Questa è la domanda che produce questo:

SELECT images.image_id, votes.vote_id 
    FROM votes JOIN images ON images.image_id=votes.image_id 

io proprio non riesco a creare una colonna vote_count che è la somma di tutti i voti che immagine ha. C'è un modo in cui posso usare la funzione count() per farlo, di cui semplicemente non sono a conoscenza?

risposta

8

È necessario GROUP BY images.image_id e utilizzare COUNT(votes.vote_id):

SELECT images.image_id, COUNT(votes.vote_id) AS cote_count 
FROM votes 
JOIN images ON images.image_id=votes.image_id 
GROUP BY images.image_id 
+0

Wow! Funziona ... perfettamente! Dov'è la magia qui? La funzione GROUP BY prende una relazione 1-a-molti e la trasforma in una relazione 1 a 1? – ReactingToAngularVues

+0

@Antilogico - Non è relativo al tipo di relazione, è relativo al gruppo, 'GROUP BY' qui fa un elenco di valori distinti di' image_id', quindi per l'altra colonna 'vote_id' usa una funzione di aggregazione con esso, che è il 'COUNT' che conta i voti per ogni gruppo' image_id'. –

+0

Grazie per il tuo aiuto! – ReactingToAngularVues

1

È generalmente necessario utilizzare GROUP BY quando si utilizzano aggregati come COUNT():

SELECT images.image_id, count(votes.vote_id) AS vote_count 
    FROM votes 
    JOIN images ON images.image_id=votes.image_id 
    GROUP BY images.image_id; 

io non sono al 100% chiaro su cosa si intende per

e il numero di voti ha sotto un c specificato ondizione (diciamo, basato su square_id) "?

Il modello sembra modellare square_id contro dell'immagine e può essere utilizzato solo come filtro where su images, non su un rapporto tra voti e le immagini.

+0

Quindi unisce una relazione da 1 a molti in un 1 a 1? GROUP BY può essere utilizzato per query più complesse come triple join? (Dove posso avere una relazione da 1 a molti a multi-molti)? – ReactingToAngularVues

+0

GROUP BY consente di "pin" una o più colonne e quindi di utilizzare aggregati come 'COUNT()', 'SUM()', 'MIN()' ecc. Se puoi dare un esempio della tua relazione, posso aggiorna la risposta. – StuartLC