SQL加入一对多关系 - 计算每个图像的投票数?

时间:2013-09-02 10:42:15

标签: mysql sql join

好的,我有两张桌子:

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

这是一对多关系。每个图像可以有多个投票,但投票只能与一个图像相关。我正在尝试生成一个连接查询,它将显示图像ID,以及它在指定条件下的投票数(例如,基于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()函数这样做,我根本不知道?

2 个答案:

答案 0 :(得分:7)

您需要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

答案 1 :(得分:1)

使用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过滤器,而不能用作投票和图片之间的关系。

相关问题