4

次の表にメッセージがあります。

+---------+---------+------------+----------+
| msg_id  | user_id | _date      | _time    |
+-------------------+------------+----------+
|   1     | 1       | 2011-01-22 | 06:23:11 |
|   2     | 1       | 2011-01-23 | 16:17:03 |
|   3     | 1       | 2011-01-23 | 17:05:45 |
|   4     | 2       | 2011-01-22 | 23:58:13 |
|   5     | 2       | 2011-01-23 | 23:59:32 |
|   6     | 3       | 2011-01-22 | 13:45:00 |
|   7     | 3       | 2011-01-23 | 13:22:34 |
|   8     | 3       | 2011-01-23 | 18:22:34 |
+---------+---------+------------+----------+

私が欲しいのは、毎日、各ユーザーが16:00の前後に送信したメッセージの数を確認することです。私は今これを2つのステップで行います:

SELECT user_id, _date, COUNT(msg_id) AS cnt 
FROM messages WHERE _time <= '16:00'
GROUP BY user_id, _date ORDER BY user_id, _date ASC

user_id _date       cnt
-----------------------------
1       2011-01-22  1
1       2011-01-23  0
2       2011-01-22  0
2       2011-01-23  0
3       2011-01-22  1
3       2011-01-23  1

SELECT user_id, _date, COUNT(msg_id) AS cnt 
FROM messages WHERE _time > '16:00'
GROUP BY user_id, _date ORDER BY user_id, _date ASC

user_id _date       cnt
-----------------------------
1       2011-01-22  0
1       2011-01-23  2
2       2011-01-22  1
2       2011-01-23  1
3       2011-01-22  0
3       2011-01-23  1

(実際には、値が「0」の行は結果セットに表示されません。明確にするために追加しただけです)

これらの2つの出力を1つに結合したいと思います。

user_id _date       before16  after16
-------------------------------------
1       2011-01-22  1         0
1       2011-01-23  0         2
2       2011-01-22  0         1
2       2011-01-23  0         1
3       2011-01-22  1         0
3       2011-01-23  1         1

ただし、このクエリの書き方がわかりません。もしそうなら、あなたの助けをいただければ幸いです:-)

4

1 に答える 1

4

これを試して:

SELECT 
    user_id, 
    _date, 
    SUM(_time <= '16:00') AS before16, 
    SUM(_time > '16:00') AS after16 
FROM messages 
GROUP BY user_id, _date
ORDER BY user_id, _date ASC
于 2012-04-11T18:47:28.333 に答える