Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/heroku/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 根据另一个元表和用户输入的条件从表中选择_Mysql_Sql_Relational Database_Schema_Mariadb - Fatal编程技术网

Mysql 根据另一个元表和用户输入的条件从表中选择

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日至

我需要的是根据保存在同一个表中的现有“预订”从表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月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
    )