繁体   English   中英

SQL 从连接中选择计数返回 0 而不是 null 结果

[英]SQL Selecting count from join returning 0 instead of null result

我有一个查询,它获取数据并连接另一个表 (A) 并计算该连接表 (B) 中的行数。 但是,如果主表 (A) 为空,我希望查询不返回任何内容。 但是,它为 id 和 date 返回 null 结果,为用户返回整数值 0 而不是 null 行。 如何获得空结果而不是返回某些内容?

返回:

id   | date | users
null | null | 0

SQL 代码

SELECT
    `sessions`.`id`,
    `sessions`.`date`,
    COUNT( sessions_users.id ) AS users 
FROM
    `sessions`
    LEFT JOIN `sessions_users` ON `sessions`.`id` = `sessions_users`.`sessions_id`

没有group by子句的聚合查询总是返回单个记录,无论底层结果集的内容如何(即使它是空的)。

但是,由于您在select子句( sessions.idsessions.date )中有非聚合列,因此您的查询无论如何都缺少group by子句。 在MySQL中的非古版本中,默认启用sql模式ONLY_FULL_GROUP_BY ,这是一个语法错误。

考虑:

SELECT
    `sessions`.`id`,
    `sessions`.`date`,
    COUNT( sessions_users.id ) AS users 
FROM
    `sessions`
    LEFT JOIN `sessions_users` ON `sessions`.`id` = `sessions_users`.`sessions_id`
GROUP BY
    `sessions`.`id`,
    `sessions`.`date`

这将产生每个会话ID和日期一个记录,在匹配记录的计数一起sessions_users 如果sessions中没有记录,则查询将返回一个空结果集。

如果我理解正确,而不是NULL ,你想要这样的东西:

id   | date | users
     |      | 0

如果是这样,只需在SELECT使用IFNULL()即可:

SELECT
    IFNULL(`sessions`.`id`,' ') as id,
    IFNULL(`sessions`.`date`,' ') as date,
....

还有一些其他方法可以仅使用IF()CASE ..来实现这一点CASE ..IFNULL非常简单。

但是,如果您不想看到任何NULL0值,请将您的LEFT JOIN更改为INNER JOIN ,您就完成了。

从您的描述来看,您似乎想要一个内部连接:

SELECT s.id, s.date, COUNT(*) as users
FROM sessions s JOIN
     sessions_users su
     ON su.id = su.sessions_id;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM