2014-09-28 88 views
0

之间我有这样的查询比较与MySQL

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 

但是,如果我有很多日期进行比较,则此查询效率不高。任何人都有解决方案使这个查询更短?

回答

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 
+0

感谢您的解决方案 – l1th1um 2014-09-28 23:07:30

1

如果您在check_incheck_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

+0

感谢您的解释 – l1th1um 2014-09-28 23:06:48

0

如果您需要检查重叠:

SELECT * 
FROM reservations 
WHERE '2014-09-04' <= check_out AND '2014-09-09' >= check_in