我有这个查询
SELECT *
FROM `reservations`
WHERE '2014-09-04' BETWEEN check_in AND check_out
在另一种情况下,我需要将此check_in和check_out字段与多个日期进行比较。此查询可以解决该问题
SELECT *
FROM `reservations`
WHERE '2014-09-04' BETWEEN check_in AND check_out
OR '2014-09-09' BETWEEN check_in AND check_out
但如果我有很多日期要比较,这个查询效率不高。有人有解决方案来缩短这个查询吗?
答案 0 :(得分:2)
更短的查询:
SELECT DISTINCT r.*
FROM reservations r
JOIN (
SELECT '2014-09-04' AS dt UNION
SELECT '2014-09-09' AS dt
) dates ON dates.dt BETWEEN r.check_in AND r.check_out
答案 1 :(得分:1)
如果您在check_in
和check_out
上没有索引,则or
的多个条件是最佳方法。如果您确实在这些列上有索引并且在第一种情况下使用它们,那么请尝试使用union
:
SELECT *
FROM `reservations`
WHERE '2014-09-04' BETWEEN check_in AND check_out
UNION
SELECT *
FROM `reservations`
WHERE '2014-09-09' BETWEEN check_in AND check_out ;
请注意union
会产生删除重复项的开销。我正在使用它,因为你可能在结果中有重复,并且可能是你不想要它们。一般情况下,我建议尽可能使用union all
。
答案 2 :(得分:0)
如果您需要检查重叠:
SELECT *
FROM reservations
WHERE '2014-09-04' <= check_out AND '2014-09-09' >= check_in