[英]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.