我有一个查询,该查询获取数据并且还联接另一个表(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`
答案 0 :(得分:1)
不带有group by
子句的聚合查询始终返回单个记录,而不管基础结果集的内容如何(即使它为空)。
但是,由于select
子句(sessions.id
和sessions.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 ..
非常简单。
但是,如果您不想看到任何IFNULL
和NULL
值,请将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;