MySQL:MIN和Group By:获取每个人每天12x#事件的第一个时间戳

时间:2015-06-07 03:32:46

标签: mysql sql

我想要做的是在给定的一天内为每个scheduled获得最短的user时间。对于下面的示例,我突出显示了当天的活动,我将在添加

的基础上对其进行过滤
AND DATE_ADD(scheduled, INTERVAL -$timezone_offset MINUTE)>='$given_day 00:00:00' 
AND DATE_ADD(scheduled, INTERVAL -$timezone_offset MINUTE)< '$next_day 00:00:00'

对于一个简化的例子,我有两张表:

checkpoints
+------+---------+----------+---------------------+
|   id | type_id | event_id | scheduled           |
+------+---------+----------+---------------------+
| 1111 |       9 |     2222 | 2015-06-05 12:00:00 |
| 1150 |       1 |     2222 | 2015-06-05 10:00:00 |
| 1200 |      11 |     3333 | 2015-06-05 23:00:00 |
| 1305 |       1 |     4444 | 2015-06-05 15:00:00 |
| 1400 |       2 |     4444 | 2015-06-05 05:00:00 |
| 1405 |       3 |     4444 | 2015-06-05 19:00:00 |
| 1500 |       1 |     5555 | 2015-06-05 17:00:00 |
| 1505 |       9 |     5555 | 2015-06-05 18:00:00 |
+------+---------+----------+---------------------+


events
+------+---------+---------------------+
|   id | user_id | start               |
+------+---------+---------------------+
| 2222 |       3 | 2015-06-05 11:00:00 | 
| 3333 |       5 | 2015-06-05 23:00:00 | 
| 4444 |       2 | 2015-06-05 07:00:00 | 
| 5555 |       5 | 2015-06-05 19:00:00 | 
+------+---------+---------------------+

我想查询以便获得以下内容:

+------+---------+---------------------+---------------------+
|   id | user_id | start               | scheduled           |
+------+---------+---------------------+---------------------+
| 1150 |       3 | 2015-06-05 11:00:00 | 2015-06-05 10:00:00 |
| 1500 |       5 | 2015-06-05 19:00:00 | 2015-06-05 17:00:00 |
| 1400 |       2 | 2015-06-05 07:00:00 | 2015-06-05 05:00:00 |
+------+---------+---------------------+---------------------+

即:任何特定驾驶员日的第一个预定时间。

我认为可行的查询是:

SELECT
    checkpoints.id AS id,
    user_id,
    start,
    MIN(scheduled) AS scheduled
FROM checkpoints
    LEFT JOIN events ON event_id=events.id
WHERE DATE_ADD(scheduled, INTERVAL -240 MINUTE)>='2015-06-05 00:00:00' 
    AND DATE_ADD(scheduled, INTERVAL -240 MINUTE)<'2015-06-06 00:00:00'
    AND user_id IS NOT NULL
GROUP BY user_id, DATE(DATE_ADD(scheduled, INTERVAL -240 MINUTE));

问题是我得到错误的检查点ID和开始时间,即使user_id和最早的是正确的。为了说明问题,我看到了如下结果:

+------+---------+---------------------+---------------------+
| id   | user_id | start               | scheduled           |
+------+---------+---------------------+---------------------+
| 1200 |       5 | 2015-06-05 23:00:00 | 2015-06-05 17:00:00 |
+------+---------+---------------------+---------------------+

我做错了什么?

1 个答案:

答案 0 :(得分:0)

对于大多数SQL实现,您的查询都是非法的。 MySQL allowsSELECT列,既未汇总也未包含在GROUP BY子句中。

但是,the server is free to choose any value from each group, so unless they are the same, the values chosen are indeterminate