Mysql 选择计数为空时返回0
所以我有这个疑问Mysql 选择计数为空时返回0,mysql,sql,Mysql,Sql,所以我有这个疑问 SELECT m.id, m.name, m.description, m.directions, COUNT(j.markerid) as marker_jingles FROM markers AS m LEFT OUTER JOIN jingles AS j ON j.markerid=m.id WHERE 1 但是我有点卡住了,因为我不知道如何让它在计数为0时返回行 衷心感谢你的帮助。非常感谢 此处不需要左连接,只需执行相关子查询即可获
SELECT m.id, m.name, m.description, m.directions, COUNT(j.markerid) as marker_jingles
FROM markers AS m
LEFT OUTER JOIN jingles AS j
ON j.markerid=m.id
WHERE 1
但是我有点卡住了,因为我不知道如何让它在计数为0时返回行
衷心感谢你的帮助。非常感谢 此处不需要左连接,只需执行相关子查询即可获得计数:
SELECT
m.id, m.name, m.description, m.directions,
(select COUNT(*)
from jingles j
where m.id = j.markerid) as marker_jingles
FROM markers AS m
WHERE 1
你的朋友是
从文件中:
如果expr1不为NULL,则IFNULL返回expr1;否则它将返回
expr2。IFNULL返回一个数值或字符串值,具体取决于
使用它的上下文
在查询中是否需要分组依据
SELECT m.id, m.name, m.description, m.directions, COUNT(j.markerid) as marker_jingles
FROM markers AS m LEFT OUTER JOIN
jingles AS j
ON j.markerid=m.id
WHERE 1
GROUP BY m.id;
原始查询应始终返回一行,其中包含联接后所有匹配项的计数。计数值不应为空-除非您使用的是非常旧的MySQL版本。大多数dbms平台独立的方法是使用COALESCE
SELECT
m.id
, m.name
, m.description
, m.directions
, COALESCE( COUNT(j.markerid), 0) as marker_jingles
FROM markers AS m
LEFT OUTER JOIN jingles AS j ON j.markerid = m.id
WHERE 1 = 1
GROUP BY m.id, m.name, m.description, m.directions
否则,IFNULL可以满足MySQL中的这种需要
MS SQL Server的ISNULL或COALESCE
NVL用于Oracle,或联合
等等
COALESCE才是真正的朋友:你建议如何在这个查询中使用它?@axiac如果IFNULLCOUNTj.markerid为0会怎么样?它没用。MySQL函数的文档清楚地说明了结果是一个BIGINT值。如果没有匹配的行,则计数返回0@在某种程度上,问题是COUNT返回null。可能是旧版本,正如@Gordon在他的解决方案中所说的。您的查询需要一个GROUP BY子句,否则它将始终只返回一行。对不起,是的,count不是null,但我认为这是因为没有返回行。我将完全指定GROUP BY,并且从不依赖MySQL默认提供的不方便的扩展。i、 e.按m.id、m.name、m.description、m。directions@Used_By_Already . . . 在GROUPBY中使用唯一id来拉入其他列并不是扩展说明:我假设id是唯一的。ANSI SQL具有函数依赖性的概念。这基本上意味着group by中使用的唯一id可以从该表中引入其他列。在其他情况下,如果不满足函数依赖性标准,那么这将是一个扩展。非常感谢,这是我最初的想法,但之前没有看到coalesce与COUNT一起使用,只有SUMyou可能不需要它,但您可以。在查询未经测试的断言中,COUNT应该从旧内存中自行返回0。根据函数[COUNT]始终返回一个数字。它没有理由返回NULL。NULL表示未知。怎么会有很多行是未知的?问题是我没有将答案分组。。。见@Gordon Linoff答案below@ambe5960这是正确的。你不需要WHERE 1,这是不允许的。请原谅我的提问,但请解释原因!如果有人告诉我它怎么不工作,我可以编辑。。。但现在我不知道怎么了。。。
SELECT
m.id
, m.name
, m.description
, m.directions
, COALESCE( COUNT(j.markerid), 0) as marker_jingles
FROM markers AS m
LEFT OUTER JOIN jingles AS j ON j.markerid = m.id
WHERE 1 = 1
GROUP BY m.id, m.name, m.description, m.directions