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

时间:2019-12-14 00:10:54

标签: mysql sql group-by

我有一个查询,该查询获取数据并且还联接另一个表(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`

3 个答案:

答案 0 :(得分:1)

不带有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中没有记录,查询将返回空结果集。

答案 1 :(得分:0)

如果我理解正确,那么您想要的不是这样的东西:{p}

NULL

如果是这样,只需在id | date | users | | 0 中像这样使用IFNULL()

SELECT

还有其他几种方法可以仅使用SELECT IFNULL(`sessions`.`id`,' ') as id, IFNULL(`sessions`.`date`,' ') as date, .... IF()来实现此目的,但是CASE ..非常简单。

但是,如果您不想看到任何IFNULLNULL值,请将0更改为LEFT JOIN,就可以了。

答案 2 :(得分:0)

根据您的描述,听起来您想要一个内部联接:

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