我有预订系统,我想显示列表的每月日历视图。我有以下表结构(还有很多其他列);
CREATE TABLE `sys_calendar` (
`dt` date NOT NULL,
PRIMARY KEY (`dt`)
);
CREATE TABLE `listings` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`title` varchar(255) NOT NULL,
PRIMARY KEY (`id`),
);
CREATE TABLE `bookings` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`listing_id` int(10) unsigned NOT NULL,
`start_date` date NOT NULL,
`end_date` date NOT NULL,
PRIMARY KEY (`id`)
);
sys_calendar
包含 2000-01-01 至 2040-12-31 的所有日期;
dt
------------
2000-01-01
2000-01-02
2000-01-03
....
2040-12-30
2040-12-31
我想要做的是显示特定商家信息的月度日历。例如;我想在2013年4月(2013-04-01和2013-04-30之间listing_id
表格中显示bookings
= 10的日历。
dt | Availability
-------------------------
2013-04-01 | No
2013-04-02 | No
2013-04-03 | Yes
2013-04-04 | Yes
2013-04-05 | Yes
2013-04-06 | Yes
....
2013-04-29 | No
2013-04-30 | Yes
我知道我必须加入sys_calendar
和bookings
表,但不确定如何。
答案 0 :(得分:1)
我认为这对你有用:
SELECT c.dt,
CASE WHEN COUNT(b.id) > 0 THEN 'No' ELSE 'Yes' END AS Availability
FROM sys_calendar c
LEFT JOIN bookings b
ON b.Listing_id = 10
AND c.dt BETWEEN b.Start_Date AND b.End_Date
GROUP BY c.dt;
<强> Example on SQL Fiddle 强>
此外,如果您想显示多种可用性,可以使用:
SELECT c.dt,
CASE WHEN COUNT(CASE WHEN b.Listing_id = 1 THEN 1 END) > 0 THEN 'No' ELSE 'Yes' END AS Availability1,
CASE WHEN COUNT(CASE WHEN b.Listing_id = 2 THEN 1 END) > 0 THEN 'No' ELSE 'Yes' END AS Availability2,
CASE WHEN COUNT(CASE WHEN b.Listing_id = 3 THEN 1 END) > 0 THEN 'No' ELSE 'Yes' END AS Availability3,
CASE WHEN COUNT(CASE WHEN b.Listing_id = 4 THEN 1 END) > 0 THEN 'No' ELSE 'Yes' END AS Availability4
FROM sys_calendar c
LEFT JOIN bookings b
ON c.dt BETWEEN b.Start_Date AND b.End_Date
WHERE c.dt BETWEEN '20130401' AND '20130430'
GROUP BY c.dt;
<强> Example on SQL Fiddle 强>