Mysql双重左外连接与计数

时间:2013-10-04 14:35:55

标签: mysql count left-join

我有以下数据库结构:

  • Song(ID,...)
  • 评论(SongID,接受)

我想查看所有歌曲,并计算一首歌的接受次数和下降次数。

我有以下查询:

SELECT s.*, COUNT(ra.ID) as Accepts, COUNT(rd.ID) as Declines 
FROM song s
LEFT OUTER JOIN review ra ON s.ID = ra.SongID AND ra.Accept = 1
LEFT OUTER JOIN review rd ON s.ID = rd.SongID AND rd.Accept = 0
GROUP BY s.ID

这不会产生正确的结果。我有一首有3个接受和1个拒绝的歌曲,查询输出3个接受和3个拒绝。我该如何解决这个问题?

2 个答案:

答案 0 :(得分:2)

juergen的解决方案的问题是,如果一首歌没有评论,那么r.accept将是null。当您使用null比较=值时,您会得到null。 (您应该使用IS来比较null值。然后,如果您SUM(添加)null值,则会再次获得null值。

所以,你应该确保当一首歌没有评论时,它会返回0而不是null

SELECT s.ID, 
       COALESCE(SUM(r.Accept = 1), 0) as Accepts, 
       COALESCE(SUM(r.Accept = 0), 0) as Declines 
FROM song s
LEFT OUTER JOIN review r ON s.ID = r.SongID
GROUP BY s.ID

COALESCE将从列表中获取第一个非null参数,因此如果SUM为null,则0将被置于其位置。

答案 1 :(得分:1)

SELECT s.ID, 
       SUM(r.Accept = 1) as Accepts, 
       SUM(r.Accept = 0) as Declines 
FROM song s
LEFT OUTER JOIN review r ON s.ID = r.SongID
GROUP BY s.ID
相关问题