栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

查找特定用户MySQL在同一张表中的日期范围重叠

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

查找特定用户MySQL在同一张表中的日期范围重叠

这是第一部分:每个用户的汽车重叠…

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



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/402749.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号