2016-07-12 7 views
0

標準のテーブルがあり、UNIXのタイムスタンプ(ログインした時刻を示す)とのUNIXタイムスタンプのカラムlastactivityがあります。登録したときを示します。MySQL関数IFNULLがGROUP BYで動作していない

カウンタは多くのユーザーが毎週登録されているか数えるので、私は数週間で、今とグループ化された結果から、24時間(86400秒)以内にアクティブであったどのように多くのユーザーを示してSQLクエリを構築しました:

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); 
+0

これは本当に表示上の問題です。プレゼンテーションレイヤーでは、これが一般的に最もよく処理されます。 – Strawberry

答えて

1

これはコメントのために長すぎます。

問題は、クエリの仕組みがわからないことです。 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でこれを解決しなければならない

EDIT:。

あなたはすべての週を含める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`); 
+0

私はLEFT JOINで試していますが、まだ動作しません。私のSQLクエリをチェックできますか? –