1

我有以下数据库结构:

  • 歌曲(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 个拒绝。我该如何解决?

4

2 回答 2

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 则 a0将被放置在其位置。

于 2013-10-04T14:46:37.473 回答
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
于 2013-10-04T14:37:27.817 回答