我正在尝试用 SQL 编写一个聚合查询,它返回连接到表中给定记录的所有记录的计数;如果没有记录加入给定记录,那么该记录的结果应该是 0
:
数据
我的数据库看起来像这样(不幸的是,我无法更改结构):
MESSAGE
----------------------------------------------
MESSAGEID SENDER SUBJECT
----------------------------------------------
1 Tim Rabbit of Caerbannog
2 Bridgekeeper Bridge of Death
MESSAGEPART
----------------------------------------------
MESSAGEID PARTNO CONTENT
----------------------------------------------
1 0 (BLOB)
1 1 (BLOB)
3 0 (BLOB)
(
MESSAGEPART
有一个复合 PRIMARY KEY("MESSAGEID", "PARTNO")
)期望输出
鉴于上面的数据,我应该得到这样的东西:
MESSAGEID COUNT(*)
-----------------------------------------------
1 2
2 0
很明显,我需要对
MESSAGE
进行左连接。表,但如何返回 0
的计数对于来自 MESSAGEPART
的连接列的行是 NULL
?我尝试了以下方法:逻辑
我试过了
SELECT m.MESSAGEID, COUNT(*) FROM MESSAGE m
LEFT JOIN MESSAGEPART mp ON mp.MESSAGEID = m.MESSAGEID
GROUP BY m.MESSAGEID;
然而,这返回
MESSAGEID COUNT(*)
-----------------------------------------------
1 2
2 1
我也试过
SELECT mp.MESSAGEID, COUNT(*) FROM MESSAGE m
LEFT JOIN MESSAGEPART mp ON mp.MESSAGEID = m.MESSAGEID
GROUP BY mp.MESSAGEID;
但这会返回
MESSAGEID COUNT(*)
-----------------------------------------------
1 2
1
我在这里做错了什么?
最佳答案
这样的事情怎么样:
SELECT m.MESSAGEID, sum((case when mp.messageid is not null then 1 else 0 end)) FROM MESSAGE m
LEFT JOIN MESSAGEPART mp ON mp.MESSAGEID = m.MESSAGEID
GROUP BY m.MESSAGEID;
COUNT() 函数将对每一行进行计数,即使它为空。使用 SUM() 和 CASE,您只能计算非空值。
编辑:取自顶级评论的更简单版本:
SELECT m.MESSAGEID, COUNT(mp.MESSAGEID) FROM MESSAGE m
LEFT JOIN MESSAGEPART mp ON mp.MESSAGEID = m.MESSAGEID
GROUP BY m.MESSAGEID;
希望有帮助。
关于sql - 计算左连接中连接的行数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20119901/