簡體   English   中英

MySQL函數IFNULL不能與GROUP BY一起使用

[英]MySQL function IFNULL not working with GROUP BY

我有一個帶有用戶列表的標准表,並且具有UNIX Timestamp的lastactivity列(顯示他們何時登錄)和帶有UNIX Timestamp的列timestamp ,它們顯示用戶何時注冊。

我建立了一個SQL查詢,該查詢顯示從現在起24小時(86400秒)內有多少用戶處於活動狀態,並按周對結果進行分組,以便計數器計算每周有多少用戶注冊:

SELECT
    IFNULL(COUNT(*),0) as `counter`,
    (WEEK(`timestamp`)) as `week`
FROM
    `clients`
WHERE
    (CAST(UNIX_TIMESTAMP() as signed) - CAST(`lastactivity` as signed)) <= 86400
GROUP BY
    WEEK(`timestamp`);

問題是函數IFNULL(COUNT(*),0)不能按我的預期工作。 即使使用IFNULL() MySQL函數,如果計數器上存在NULL / 0,此SQL查詢也不會顯示星期。 那可能是因為GROUP BY是如何工作的。 因此,例如,我將得到這種結果:

counter | week
   2    |  11
   1    |  13
   9    |  14
   6    |  17

但是我想每周這樣展示:

counter | week
   2    |  11
   0    |  12
   1    |  13
   9    |  14
   0    |  15
   0    |  16
   6    |  17

任何人都知道如何解決此問題?

戈登試圖通過獲取LEFT JOIN查詢來幫助我,但我仍然得到相同的結果,也許我在這里做錯了什么:

SELECT
    COUNT(a.id) as `counter`,
    (WEEK(b.timestamp)) as `week`
FROM
    `users` a
LEFT JOIN
    `users` b
ON
    a.id = b.id
WHERE
    (CAST(UNIX_TIMESTAMP() as signed) - CAST(a.lastactivity as signed)) <= 86400
GROUP BY
    WEEK(b.timestamp);

這個評論太長了。

問題是您不了解查詢的工作方式。 IFNULL() (或標准版本COALESCE()會將NULL的值轉換為其他值。但是, COUNT()從不返回NULL

SELECT COUNT(*) as `counter`, WEEK(`timestamp`) as `week`
FROM `clients`
WHERE (CAST(UNIX_TIMESTAMP() as signed) - CAST(`lastactivity` as signed)) <= 86400
GROUP BY WEEK(`timestamp`);

您的問題是缺少行,而不是NULL值。 您必須使用LEFT JOIN解決此問題。

編輯:

您需要left join才能包含所有星期:

SELECT COUNT(c.timestamp) as `counter`, wk as `week`
FROM (SELECT 11 as wk UNION ALL
      SELECT 12 UNION ALL
      SELECT 13 UNION ALL
      SELECT 14 UNION ALL
      SELECT 15 UNION ALL
      SELECT 16 UNION ALL
      SELECT 17
     ) w LEFT JOIN
     `clients` c
     ON WEEK(c.`timestamp`) = w.wk
WHERE (CAST(UNIX_TIMESTAMP() as signed) - CAST(`lastactivity` as signed)) <= 86400
GROUP BY WEEK(`timestamp`);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM