出租车司机队列管理MySQL查询

时间:2015-06-25 04:28:10

标签: mysql sql database query-performance

我正在开发一个Taxi Booking app后端。我有一个预订表,我保存所有预订信息。

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

  

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位司机(driver_id = 1,2)在10:47之后预订。所以司机3值得下次预订。

这是SQL小提琴: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

我需要一些更好的解决方案。我不喜欢子查询。上面的表和查询仅用于简单示例。原始详细的业务逻辑和查询更复杂。所以我想尽可能简化这部分。

主要问题是当应用GROUP BY(在sql注释中)时,它不遵守ORDER BY子句。换句话说,在应用排序之前应用GROUP BY。为了解决这个问题,我在子查询中通过booking_time DESC执行订单,然后应用group by并通过booking_time ASC进行订购。

是否可以在不进行子查询的情况下实现它?

1 个答案:

答案 0 :(得分:2)

请尝试此查询:

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