我有以下数据库结构:
我想查看所有歌曲,并计算一首歌的接受次数和下降次数。
我有以下查询:
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个拒绝。我该如何解决这个问题?
答案 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