我的数据库中有多个预订。每个预订属于不同的公寓。现在一些预订在同一日期预订了两次,或者在日期上稍微交叉预订,这意味着它已超额预订我如何进行查询,过滤每个属性并查找超额预订并返回我的计数?我试过:
function getOverbookingcount() {
$sql = "
SELECT *
FROM reservations a
INNER JOIN reservations b
ON DATE(b.start) > DATE(a.start) AND DATE(b.start) < DATE(a.end)
AND a.room_id != b.room_id
";
$result = return_ci()->db->query($sql);
return $result->result_array();
}
没有运气。
表:预订
-------------------------------------------------------------
DBASE_ID | room_id | start | end
-------------------------------------------------------------
1 |76036 |2015-12-15 14:00:00 | 2015-12-19 11:00:00
2 |76036 |2016-01-17 14:00:00 | 2016-01-19 11:00:00
3 |76036 |2015-10-29 14:00:00 | 2015-11-01 11:00:00
4 |76036 |2015-10-30 14:00:00 | 2015-11-05 11:00:00
5 |103099 |2015-12-15 14:00:00 | 2015-12-19 11:00:00
6 |103099 |2016-01-17 14:00:00 | 2016-01-19 11:00:00
7 |103099 |2015-10-29 14:00:00 | 2015-11-01 11:00:00
8 |103099 |2015-10-29 14:00:00 | 2015-11-03 11:00:00
答案 0 :(得分:1)
您可以使用以下查询:
SELECT r1.DBASE_ID, r1.room_id, r1.start, r1.end
FROM reservations AS r1
INNER JOIN reservations AS r2
ON r1.room_id = r2.room_id AND
r1.DBASE_ID < r2.DBASE_ID AND
r1.start <= r2.end and r1.end >= r2.start
这些条件:
r1.start <= r2.end and r1.end >= r2.start
检查两个不同预订记录之间的重叠间隔。
如果两个保留记录之间存在重叠,则上述查询将返回具有最小 DBASE_ID
值的记录。要返回两个记录,您应该使用:r1.DBASE_ID <> r2.DBASE_ID
代替:r1.DBASE_ID < r2.DBASE_ID
。