我正在开发一个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进行订购。
是否可以在不进行子查询的情况下实现它?
答案 0 :(得分:2)
请尝试此查询:
select driver_id, max(booking_time) m
from bookings
group by driver_id
order by count(*),m
limit 1;