出租车Driver排队管理MySQL查询

Taxi Driver Queue management MySQL query

我正在开发出租车预订应用 back-end。我有一个预订 table,我在其中保存了所有预订信息。

预订table中的两个主要字段是:

driver_id

booking_time

对于队列管理,业务逻辑是先到先得,当队列完成后,该过程将按循环顺序继续运行。

举个例子:

`id`  `driver_id` `booking_time`
 1     2           2015-06-24 10:00:12
 2     1           2015-06-24 10:05:25
 3     3           2015-06-24 10:10:36
 4     2           2015-06-24 10:30:41
 5     1           2015-06-24 10:45:45
 6     3           2015-06-24 10:47:18
 7     2           2015-06-24 10:50:49
 8     1           2015-06-24 10:55:49

根据上面的业务逻辑,下一次预订应该是根据上次预订时间提供给driver_id = 3。因为如果我们查看最后 3 个预订,driver_id = 3 在 10:47:18 进行了预订,另外 2 drivers (driver_id = 1, 2) 进行了预订在 10:47 之后。所以driver 3值得下一次预订。

这里是 SQL Fiddle: http://sqlfiddle.com/#!9/aa08b/6

SELECT tmp.driver_id, 
       tmp.booking_time 
FROM  (SELECT driver_id, 
              booking_time 
       FROM   bookings 
       -- GROUP BY driver_id 
       ORDER  BY booking_time DESC) tmp 
GROUP  BY tmp.driver_id 
ORDER  BY tmp.booking_time ASC 
LIMIT  1 

有效,我得到了预期的输出:

3           2015-06-24 10:47:18

我需要一些更好的解决方案。我不喜欢子查询。上面的 table 和查询只是为了简单的例子。原来详细的业务逻辑和查询要复杂得多。所以我想尽可能简化这部分。

主要问题是在应用 GROUP BY(在 sql 评论中)时,它不遵守 ORDER BY 子句。换句话说,在应用排序之前应用 GROUP BY。为了克服这个问题,我在子查询中按 booking_time DESC 进行排序,然后应用分组依据并按 booking_time ASC 将其返回。

不做子查询是否可以实现?

请尝试这个查询:

select driver_id, max(booking_time) m 
from bookings 
group by driver_id 
order by count(*),m 
limit 1;