【发布时间】:2013-12-18 12:07:29
【问题描述】:
我有两张桌子,
-
prices (pcode, date, priceperweek)- 1 条记录涵盖 1 周
-
booked (pcode, date)- 1 条记录 = 1 天,因为有短线可供使用
一个表单由3个字段组成
- 开始日期
- 灵活性(+/- 1/2/3 周)
- 持续时间(3 / 4 / 5 / 6 / 7 / 14))。
下面的查询应该是选择价格和日期,并检查所选的开始日期是否出现在价格表中,以及从开始日期开始的每一天是否都没有出现在预订表中。
SELECT SUM(priceperweek) AS `ppw`, prices.date AS `startdate`
FROM `prices` LEFT JOIN `booked` ON prices.pcode=booked.pcode
WHERE prices.pcode='A2CD59GH'
AND (prices.date IN ('20131221', '20131228')
AND booked.date NOT IN ('20131221', '20131222', '20131223',
'20131224', '20131225', '20131226', '20131227', '20131228',
'20131229', '20131230', '20131231', '20140101', '20140102',
'20140103')
)
OR (prices.date IN ('20131214', '20131221')
AND booked.date NOT IN ('20131214', '20131215', '20131216',
'20131217',
'20131218', '20131219', '20131220', '20131221', '20131222',
'20131223', '20131224', '20131225', '20131226', '20131227')
)
OR (prices.date IN ('20131228', '20140104') AND booked.date NOT IN
('20131228', '20131229', '20131230', '20131231', '20140101',
'20140102', '20140103', '20140104', '20140105', '20140106',
'20140107', '20140108', '20140109', '20140110')
)
GROUP BY prices.date
ORDER BY prices.date ASC
赋予查询的值...
- 开始日期 = 20131221
- 持续时间 = 14
- 属性 = A2CD59GH
- 加减号 = 1
我的问题是,即使某个范围内的某些日期出现在“bookings”表中并且 ppw 值比我预期的要多很多,此查询也会返回记录。
使用 SUM(ppw) 的原因是当指定 14 的持续时间时,价格将两个星期相加。
感谢您对此的任何帮助
【问题讨论】:
-
也许从简单的开始,然后逐渐增加复杂性。此外,该 LEFT JOIN 呈现为 INNER JOIN。这就是你想要的吗?
-
我希望返回给定开始日期的价格,其中该属性的预订表中没有出现持续时间中的日期。如果可能的话,如果持续时间为 14,则对价格求和,否则只返回每周的价格,我可以在使用 PHP 显示之前对总价格求和
标签: php mysql select left-join