首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Mysql双左外连接和计数

问Mysql双左外连接和计数
EN

Stack Overflow用户
提问于 2013-10-04 14:35:55
回答 2查看 335关注 0票数 1

我有以下DB结构:

  • 歌曲(ID .)
  • 评审(SongID,接受)

我想看看所有的歌曲,数一数有多少接受和多少拒绝歌曲有。

我有以下查询:

代码语言:javascript
复制
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下降。我该怎么解决这个问题?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-10-04 14:46:37

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

因此,您应该确保当一首歌曲没有评论时,它将返回0而不是null。

代码语言:javascript
复制
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。

票数 2
EN

Stack Overflow用户

发布于 2013-10-04 14:37:27

代码语言:javascript
复制
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
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19183945

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档