【问题标题】:MySQL select id which is not in specific date and time [duplicate]MySQL选择ID不在特定日期和时间[重复]
【发布时间】:2015-01-16 11:24:33
【问题描述】:

我有两个表名为 carsbooking。 我要查找的是可供预订的可用汽车,简单来说就是从cars 中选择汽车的详细信息,其id 在特定日期和时间不在预订表中。

预订表有 pick_date(date),drop_date(date),pick_time(time),drop_time(time),car_id(int),booking_id(int) blah blah 列。

现在我被困在获得可用的汽车上。请你指导我如何在mysql中做到这一点。以下是预订表的 4 列。

Pick_Date   Drop_Date    Pick_Time        Drop_Time
----------  -----------  -----------      --------------
2015-01-15  2015-01-15   09:00:00.000000  10:00:00.000000

【问题讨论】:

  • 不,先生,那是完全不同的事情
  • 有什么问题,您使用了什么查询?日期和时间没有任何格式,它们是二进制值。
  • 是的,RiggsFolly 提到的问题完全一样。

标签: mysql sql date datetime select


【解决方案1】:

您可以使用left joinnot innot exists 执行此操作。 left join 看起来像

select c.*
from cars c left join
     bookings b
     on c.car_id = b.car_id and
        @pickdt <= addtime(drop_date, drop_time) and
        @dropdt >= addtime(pick_date, pick_time)
where b.car_id is null;

变量@pickdt@dropdt 是您要查找的接送时间。这将检查该期间与预订期间之间的任何重叠。它会选择完全没有重叠的汽车。

注意:您应该将日期时间值存储在单个列中,而不是两个单独的值与日期和时间。

【讨论】:

  • 对这样的字段应用函数会阻止数据库使用索引并导致全表扫描。单列将消除该问题。事实上,WHERE 语句应该在比较日期的部分和仅在日期相同时比较时间的部分中被打破。非常难看,但这是确保生产性能的唯一方法
  • @PanagiotisKanavos 。 . .由于car_id 的相等条件,这可能不会导致“全表扫描”而是索引扫描。但是,将日期/时间值存储在单个字段中将允许使用复合索引,从而加快查询速度。
  • car_id 上的唯一条件是对连接结果进行空检查,因此它不是选择性的。这实际上取决于底层数据统计信息以及查询优化器如何决定执行查询。无论哪种情况,性能都会很差
【解决方案2】:

试试这个:

SELECT c.car_id
FROM cars c 
LEFT JOIN ( SELECT car_id 
            FROM bookings 
            WHERE '2015-01-15 11:00:00' BETWEEN CAST(CONCAT(Pick_Date, ' ', Pick_Time) AS DATETIME) AND CAST(CONCAT(Drop_Date, ' ', Drop_Time) AS DATETIME) 
          ) AS A ON c.car_id = A.car_id 
WHERE A.car_id IS NULL

【讨论】:

  • 对这样的字段应用函数会阻止数据库使用索引并导致全表扫描。
  • 谢谢,我被困了好几个小时,你给出的答案非常快速而且很棒。致谢
  • 你会解释@PanagiotisKanavos吗???
  • 这个语句的写法,服务器必须在检查日期范围之前计算表中每一行的日期时间,所以它不能使用任何索引覆盖日期和时间列。即使在相对较小的数据库中,这也会降低性能。如果你有一个正确的日期时间列,你可以使用范围查询(例如pick_dt between @pickdt and @dropdt),服务器可以使用任何覆盖它的索引来检查满足条件的行
  • 你会改变查询吗?我是新手@PanagiotisKanavos
【解决方案3】:

您可以使用 MySql 的 "NOT IN"。如果仍需要帮助,请对此进行评论。

SELECT * FROM cars WHERE cars.id NOT IN (SELECT id FROM booking);

希望此查询对您有所帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多