我意识到这个问题已经以各种形式提出,但我正在努力将其实现到我的应用程序中。
以下是我的表格设置:
home: home_id, booking_id, name, address, location, etc
booking: booking_id, fromdate, todate
我正在尝试构建一个可以返回房屋可用性的搜索。因此,如果家庭“A”未从“2011年4月4日 - 4/10/2011”预订,那么它将返回“A”作为结果。
感谢您的帮助。
好的,所以根据你们的说法,我已经对我的表进行了调整以规范化它们,然后在我的PHP中使用了以下查询:
SELECT home.home_id,home.name,home.address 从家里 LEFT JOIN(选择home_id 从预订 来自BETWEEN'2011-04-06'和'2011-04-07'的日期 或者预约BETWEEN'2011-04-06'和'2011-04-07') 在home.home_id = booking.home_id 在哪里booking.home_id IS NULL
但是,当我在我的预订表中有一个条目是“booking_id = 1”,“home_id = 1”,“from_date = 2011-03-31”,“to_date = 2011-04-10”使用上面的内容示例返回我不想要的这一行。我将尝试大于值,看看这是否解决了这个问题。
答案 0 :(得分:1)
SELECT H.home_id, H.name, H.address, H.location
FROM Home H
LEFT JOIN (SELECT booking_id
FROM booking
WHERE @fromdate BETWEEN fromdate AND todate
OR @todate BETWEEN fromdate AND todate) B
ON H.booking_id = B.booking_id
WHERE B.booking_id IS NULL
答案 1 :(得分:1)
除非你从一个规范化的数据库开始 - 它当前的架构没有任何意义 - 它可能有多个预订 - 但你似乎将home_id作为主页引用预订中的外键 - 这应该不会起作用 - 这应该是相反(预订应参考home_id)。
使用正确的架构:
SELECT home.*
FROM home h
WHERE NOT EXISTS (
SELECT 1 FROM booking b
WHERE b.end_date>$start_time
AND b.start_date<$end_time
AND b.home_id=h.home_id
);
或
SELECT home.*
FROM home h
LEFT JOIN booking b
ON (b.home_id=h.home_id
AND b.end_date>$start_time
AND b.start_date<$end_time
)
WHERE b.home_id IS NULL;
预订时索引(start_time,end_time,home_id)应该合理有效。