[英]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.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
中沒有記錄,則查詢將返回一個空結果集。
如果我理解正確,而不是NULL
,你想要這樣的東西:
id | date | users
| | 0
如果是這樣,只需在SELECT
使用IFNULL()
即可:
SELECT
IFNULL(`sessions`.`id`,' ') as id,
IFNULL(`sessions`.`date`,' ') as date,
....
還有一些其他方法可以僅使用IF()
或CASE ..
來實現這一點CASE ..
但IFNULL
非常簡單。
但是,如果您不想看到任何NULL
和0
值,請將您的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.