出租车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;
我正在开发出租车预订应用 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;