这是第一部分:每个用户的汽车重叠…
SQLFiddle-相关查询和联接查询
第二部分-
同一辆车同时使用多个用户:SQLFiddle相关查询和Join查询。在下面查询…
我使用相关查询:
您可能需要在userid和’car’上建立索引。但是-请检查“解释计划”以查看mysql如何访问数据。并尝试一下:)
每位使用者重叠的汽车
查询:
SELECt `allCars`.`userid` AS `allCars_userid`, `allCars`.`car` AS `allCars_car`, `allCars`.`From` AS `allCars_From`, `allCars`.`To` AS `allCars_To`, `allCars`.`tableid` AS `allCars_id` FROM `cars` AS `allCars` WHERe EXISTS(SELECt 1 FROM `cars` AS `overlapCar`WHERe `allCars`.`userid` = `overlapCar`.`userid` AND `allCars`.`tableid` <> `overlapCar`.`tableid` AND NOT ( `allCars`.`From` >= `overlapCar`.`To` OR `allCars`.`To` <= `overlapCar`.`From`)) ORDER BY `allCars`.`userid`, `allCars`.`From`, `allCars`.`car`;
结果:
allCars_userid allCars_car allCars_From allCars_To allCars_id -------------- ----------- ------------ ---------- ------------ 1 Navara 2015-03-01 2015-03-31 3 1 GTR 2015-03-28 2015-04-30 4 1 Skyline 2015-04-29 2015-05-31 9 2 Aygo 2015-03-01 2015-03-31 7 2 206 2015-03-29 2015-04-30 8 2 Skyline 2015-04-29 2015-05-31 10
为什么有效? 或我的想法:
我使用相关查询,因此没有重复项,这对我来说可能是最容易理解的。还有其他表达查询的方式。每个都有优点和缺点。我想要一些我容易理解的东西。
要求:对于每个用户,请确保他们没有同时拥有两辆或更多辆汽车。
因此,对于每个用户记录(AllCars)检查完整表(overlapCar),看看是否能找到一个 不同的
记录是当前记录的时间重叠。如果找到一个,则选择我们正在检查的当前记录(在allCars中)。
因此, 重叠 检查为:
- 的
allCars
userid
和overLap
userid
必须是相同的 - 在
allCars
汽车记录和overlap
车记录 必须是不同的 - 的
allCars
时间范围和overLap
时间范围必须重叠。
时间范围检查:
不用检查重叠时间,而使用正面测试。最简单的方法是检查它是否重叠,然后对其应用a
NOT。
一辆汽车同时有多个用户…
查询:
SELECt `allCars`.`car` AS `allCars_car`, `allCars`.`userid` AS `allCars_userid`, `allCars`.`From` AS `allCars_From`, `allCars`.`To` AS `allCars_To`, `allCars`.`tableid` AS `allCars_id` FROM `cars` AS `allCars` WHERe EXISTS (SELECt 1 FROM `cars` AS `overlapUser` WHERe `allCars`.`car` = `overlapUser`.`car`AND `allCars`.`tableid` <> `overlapUser`.`tableid` AND NOT ( `allCars`.`From` >= `overlapUser`.`To` OR `allCars`.`To` <= `overlapUser`.`From`)) ORDER BY `allCars`.`car`, `allCars`.`userid`, `allCars`.`From`;
结果:
allCars_car allCars_userid allCars_From allCars_To allCars_id ----------- -------------- ------------ ---------- ------------Skyline 1 2015-04-29 2015-05-31 9Skyline 2 2015-04-29 2015-05-31 10
编辑:
鉴于@philipxy的评论,关于需要“大于或等于”检查的时间范围,我在这里更新了代码。我没有改变
SQLFiddles。



