Mysql 根据另一个元表和用户输入的条件从表中选择
我需要的是根据保存在同一个表中的现有“预订”从表1中检索可用的“汽车”,其中“汽车”和“预订”都具有相同的元表,该元表在元表的key=>value列中保存预订的开始日期和结束时间,例如: 卡拉有以下保留意见:Mysql 根据另一个元表和用户输入的条件从表中选择,mysql,sql,relational-database,schema,mariadb,Mysql,Sql,Relational Database,Schema,Mariadb,我需要的是根据保存在同一个表中的现有“预订”从表1中检索可用的“汽车”,其中“汽车”和“预订”都具有相同的元表,该元表在元表的key=>value列中保存预订的开始日期和结束时间,例如: 卡拉有以下保留意见: 7月4日至7月8日 7月9日至14日 7月18日至7月20日 如果用户查询7月15日至7月17日期间的可用汽车,则应返回可用的carA。 如果查询7月14日至7月17日期间的可用车辆,则carA不可用。 如果查询7月16日至7月18日期间的可用车辆,则carA不可用。 如果查询7月16日至
如果查询7月14日至7月17日期间的可用车辆,则carA不可用。
如果查询7月16日至7月18日期间的可用车辆,则carA不可用。
如果查询7月16日至7月21日期间的可用车辆,则carA不可用。
为了进一步说明,以下是简化的数据库模式: 表1-项目
表2-项目元
表1(项目) 表2(项目元)
我认为这是一个有趣的挑战,你知道查询的结构应该如何服务于这个目的吗,这可能吗?感谢您的帮助,谢谢。我创建了一个子查询,将项目元数据转换为一个表,其中包含汽车ID、预订ID、开始时间和结束时间。这在下面的查询中表示为表R。数据采用此格式后,您可以查询预订数据,查看您的搜索日期和现有预订之间是否存在重叠 以下查询提供了与给定搜索日期冲突的所有保留的列表。您可以使用此列表了解要排除哪些车辆,因为它们已在搜索日期期间保留
set @SearchStartTime = cast('2018-07-03 00:00:00' as datetime);
set @SearchEndTime = cast('2018-07-05 00:00:00' as datetime);
select carID, rid, StartTime, EndTime from
(
select Cars.`value` as carID, coalesce(Starts.rid, Ends.rid) as rid, StartTime, EndTime from
(select id, rid, `value` from items_meta
where `key`='car_id' ) Cars
left outer join
(select id, rid, cast(`value` as datetime) as StartTime from items_meta
where `key`='start_time' ) Starts
on Starts.rid = Cars.rid
left outer join
(
select id, rid, cast(`value` as datetime)as EndTime from items_meta
where `key`='end_time') Ends
on Ends.rid = Cars.rid
) R
where
(
@SearchStartTime between R.StartTime and R.EndTime
or
@SearchEndTime between R.StartTime and R.EndTime
or
R.StartTime between @SearchStartTime and @SearchEndTime
or
R.EndTime between @SearchStartTime and @SearchEndTime
)
你能控制桌子的结构吗?如果数据以更规范化的格式进行结构化,则可以更轻松地解决这一问题。如果你能控制数据结构,我可以提出一些建议。不幸的是,没有@Chanicho,如果我们能重组架构,这不会是一个挑战。谢谢。谢谢,但不是我想要的答案,它需要是一个查询才能在mysql中处理。我更新了答案,因此它是为mysql编写的
+-----+---------+--------------+---------------------+
| id | rid | key | value |
+-----+---------+--------------+---------------------+
| 1 | 4 | start_time | 2018-07-4 11:51:34 |
| 2 | 4 | end_time | 2018-07-8 11:51:34 |
| 3 | 4 | car_id | 1 |
| 4 | 5 | start_time | 2018-07-9 11:51:34 |
| 5 | 5 | end_time | 2018-07-14 11:51:34 |
| 6 | 5 | car_id | 1 |
| 7 | 6 | start_time | 2018-07-18 11:51:3 |
| 8 | 6 | end_time | 2018-07-20 11:51:34 |
| 9 | 6 | car_id | 1 |
| 10 | 7 | start_time | 2018-07-18 11:51:3 |
| 11 | 7 | end_time | 2018-07-20 11:51:34 |
| 12 | 7 | car_id | 18 |
+-----+---------+--------------+---------------------+
set @SearchStartTime = cast('2018-07-03 00:00:00' as datetime);
set @SearchEndTime = cast('2018-07-05 00:00:00' as datetime);
select carID, rid, StartTime, EndTime from
(
select Cars.`value` as carID, coalesce(Starts.rid, Ends.rid) as rid, StartTime, EndTime from
(select id, rid, `value` from items_meta
where `key`='car_id' ) Cars
left outer join
(select id, rid, cast(`value` as datetime) as StartTime from items_meta
where `key`='start_time' ) Starts
on Starts.rid = Cars.rid
left outer join
(
select id, rid, cast(`value` as datetime)as EndTime from items_meta
where `key`='end_time') Ends
on Ends.rid = Cars.rid
) R
where
(
@SearchStartTime between R.StartTime and R.EndTime
or
@SearchEndTime between R.StartTime and R.EndTime
or
R.StartTime between @SearchStartTime and @SearchEndTime
or
R.EndTime between @SearchStartTime and @SearchEndTime
)