我在数据库中有两个表。 “汽车”,“预订”
表“ car”具有以下列
CREATE FUNCTION SHOW_ADMIN(PID INT(11)) RETURNS VARCHAR(50)
BEGIN
declare retval varchar(50) default "";
set retval = (SELECT NAME FROM ADMINS WHERE ID = PID);
RETURN retval;
END
->主键
id
-> SUV,标准,经济型汽车的名称
name
->可用汽车数量
表“预订”具有以下列
count
->预留ID自动递增
id
->预订开始日期,例如:'2019-01-01 00:00:00'
date_out
->预订结束日期,例如:'2019-01-05 23:59:59'
date_in
->表'car'中的汽车名称之一
我想查询数据库以显示每种类型的汽车在某个日期范围内的可用性/短缺情况。
所以输出应类似于此表。
----日期----- 汽车名称 可用性/短缺
2019-01-01 ---- SUV ---- 1
2019-01-01 经济型 -1
负号表示短缺
正号表示有空
我做了什么
此查询仅适用于指定的单个日期和汽车名称。
car_name
在转换用户输入的日期范围的查询时遇到问题。
答案 0 :(得分:1)
您可以使用table of dates。在下面的示例中,我将简单地键入日期:
SELECT datelist.dt, car.name, car.count - COUNT(reservation.id) AS available
FROM (
SELECT '2019-02-14' AS dt UNION ALL -- check availability from date
SELECT '2019-02-15' UNION ALL
SELECT '2019-02-16' UNION ALL
SELECT '2019-02-17' UNION ALL
SELECT '2019-02-18' -- check availability to date
) AS datelist
CROSS JOIN car
LEFT JOIN reservation ON datelist.dt BETWEEN reservation.date_out AND reservation.date_in
AND car.name = reservation.car_name
GROUP BY datelist.dt, car.name, car.count
在MySQL 8中,您可以使用递归cte来构建日期:
WITH RECURSIVE datelist AS (
SELECT '2019-02-14' + INTERVAL 0 DAY AS dt
UNION ALL
SELECT dt + INTERVAL 1 DAY FROM datelist WHERE dt < '2019-02-18'
)
SELECT datelist.dt, car.name, car.count - COUNT(reservation.id) AS available
FROM datelist
CROSS JOIN car
LEFT JOIN reservation ON datelist.dt BETWEEN reservation.date_out AND reservation.date_in
AND car.name = reservation.car_name
GROUP BY datelist.dt, car.name, car.count