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