工作查询: 我的查询正在运行,我也得到了我想要的结果。我只想知道我是否做错了什么,因为我听说在 Where 子句中使用 IF 不是正确的方法,但就我而言,它甚至是在子查询中。我自己做了这个查询。如果我的查询有更好的选择,请告诉我。
寻找:我试图让所有那些在 14:00 和 15:00 之间不忙的员工,其中 14:00 和 15:00 是来自输入字段(如搜索)的时间。
SELECT *
FROM `schedule`
WHERE appointment_id NOT IN (
SELECT appointment_id
FROM `schedule`
WHERE ( IF(start_time < '14:00', '14:00', start_time) >= '14:00'
AND IF(end_time > '15:00', '15:00', end_time) >= '14:00')
AND (IF(start_time < '14:00', '14:00', start_time) <= '15:00'
AND IF(end_time > '15:00', '15:00', end_time) <= '15:00')
AND `appoint_date` = '2018-11-30')
我什至看不到 IF
调用的意义,我们可能会在没有它们的情况下重写您的查询:
SELECT *
FROM schedule
WHERE appointment_id NOT IN (
SELECT appointment_id
FROM schedule
WHERE
end_time >= '14:00' AND -- this
start_time <= '15:00' AND -- and this tests for all possible cases of overlap
appoint_date = '2018-11-30');
我能够删除您的 WHERE
子句中的两个条件,因为它们始终为真。这是两个示例之一:
IF (start_time < '14:00', '14:00', start_time) >= '14:00'
这将始终为真,因为 14:00
或更早的任何时间都会提前到 14:00
。所以,这样的时间总是 >= 14:00
。同样,任何已经大于 14:00
的时间也将通过检查。因此,可以删除整个术语以及另一个术语。
我是一名优秀的程序员,十分优秀!