簡體   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