SQL присоединяется к одному из многих отношений - подсчитывает количество голосов на изображение?

Хорошо, поэтому у меня есть 2 таблицы:

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

Это отношение от одного до многих. Каждое изображение может иметь несколько голосов, но голосование может быть связано только с одним изображением. Я пытаюсь создать запрос соединения, который будет показывать идентификатор изображения, и количество голосов, которое оно имеет в определенном состоянии (скажем, на основе square_id). Таким образом, результат запроса будет выглядеть примерно так:

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

Но самое лучшее, что я могу сделать, это следующее:

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

Увидеть проблему? Каждый image_id отображается несколько раз за каждый vote_id, который он имеет. Это запрос, который производит это:

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

Я просто не могу создать столбец vote_count, который является суммой всех голосов, которые есть у этого изображения. Есть ли способ, которым я могу использовать функцию count(), чтобы это сделать, что я просто не знаю?

Ответ 1

Вам нужно GROUP BY images.image_id и использовать 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

Ответ 2

Обычно вам нужно использовать GROUP BY при использовании агрегатов типа 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;

Я не на 100% понимаю, что вы подразумеваете под

и количество голосов, которое оно имеет в определенном состоянии (скажем, на основе на square_id) "?

Ваша модель, по-видимому, моделирует square_id для изображения и может использоваться только как фильтр where на images, а не на связи между голосами и изображениями.