我想要做的是在给定的一天内为每个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 |
+------+---------+---------------------+---------------------+
我做错了什么?
答案 0 :(得分:0)
对于大多数SQL实现,您的查询都是非法的。 MySQL allows到SELECT
列,既未汇总也未包含在GROUP BY
子句中。
但是,the server is free to choose any value from each group, so unless they are the same, the values chosen are indeterminate