2013-09-02 5 views
10

Ok, więc mam 2 tabele:SQL dołączyć do jednego do wielu relacji - policzyć liczbę głosów na obraz?

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 

Jest to jeden do wielu relacji. Każdy obraz może mieć wiele głosów, ale głos może być powiązany tylko z jednym obrazem. Próbuję utworzyć zapytanie dołączenia, które wyświetli identyfikator obrazu i liczbę głosów, które ma pod określonym warunkiem (np. Na podstawie square_id). Zatem wynik zapytania będzie wyglądał podobnie do tego:

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

Ale najlepsze, co mogę zrobić, to w ten sposób:

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

widzi ten problem? Każdy image_id jest wymieniony wiele razy dla każdego z nich, vote_id. To jest kwerenda, która produkuje to:

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

po prostu nie może wydawać się utworzyć kolumnę vote_count która jest sumą wszystkich głosów, że obraz ma. Czy jest jakiś sposób, że mogę użyć funkcji count(), aby to zrobić, o czym po prostu nie jestem świadomy?

Odpowiedz

8

Trzeba GROUP BY images.image_id i używać 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! Działa to ... idealnie! Gdzie jest magia? Czy funkcja GROUP BY przyjmuje relację jeden-do-wielu i przekształca ją w relację jeden-do-jednego? – ReactingToAngularVues

+0

@Antilogical - Nie chodzi o typ statku relacji, chodzi o grupę, tutaj "GROUP BY" tworzy listę różnych wartości 'image_id', a następnie dla drugiej kolumny' vote_id' używa funkcji agregującej, czyli 'COUNT', który zlicza głosy dla każdego zgrupowanego' image_id'. –

+0

Dzięki za pomoc! – ReactingToAngularVues

1

Zazwyczaj trzeba użyć GROUP BY przy użyciu agregatów jak 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; 

nie jestem w 100% jasne, na co masz na myśli

oraz liczba głosów pod określonymi ondition (na przykład na square_id) "?

Twój model wydaje się modelować square_id przed obrazem i mogą być używane tylko jako where filtra na images, a nie na relacji między głosów i obrazów.

+0

Czyli łączy 1 do wielu relacji w 1 do 1? Czy można użyć GROUP BY do bardziej złożonych zapytań, takich jak potrójne połączenia? (Gdzie mogę mieć relację od 1 do wielu do wielu)? – ReactingToAngularVues

+0

GROUP BY pozwala ci przypiąć jedną lub więcej kolumn, a następnie użyć agregacji takich jak 'COUNT()', 'SUM()', 'MIN()' itd. Jeśli możesz podać przykład swojego związku, mogę zaktualizuj odpowiedź. – StuartLC

Powiązane problemy