我正在开发美容院的预订系统。我有以下表格:
提供者 - 沙龙的工作人员。
TABLE `providers` (
`providerId` int(11) NOT NULL AUTO_INCREMENT,
`providerName` varchar(150) NOT NULL DEFAULT '',
PRIMARY KEY (`providerId`)
)
101 Anna
102 Beata
服务 - 他们提供的不同服务
TABLE `services` (
`serviceId` int(11) NOT NULL AUTO_INCREMENT,
`service` varchar(150) NOT NULL DEFAULT '',
`serviceDuration` int(11) NOT NULL,
`providerId` int(11) NOT NULL,
PRIMARY KEY (`serviceId`)
)
1 Hair cut 30 101
2 Hair coloring 120 101
时间表 - 每个提供商何时提供不同服务的表格
TABLE `schedule` (
`scheduleId` int(11) NOT NULL AUTO_INCREMENT,
`serviceId` int(11) NOT NULL,
`providerId` int(11) NOT NULL,
`scheduleStartDateTime` datetime NOT NULL,
`scheduleEndDateTime` datetime NOT NULL,
PRIMARY KEY (`scheduleId`)
)
1 1 101 2014-10-17 10:00:00 2014-10-17 10:29:59
2 1 101 2014-10-17 10:30:00 2014-10-17 10:59:59
3 1 101 2014-10-17 11:00:00 2014-10-17 11:29:59
4 1 101 2014-10-17 11:30:00 2014-10-17 11:59:59
5 1 101 2014-10-17 12:00:00 2014-10-17 12:29:59
6 2 101 2014-10-17 10:30:00 2014-10-17 12:29:59
最后是预订 - 已预订服务的表格。
TABLE `bookings` (
`bookingId` int(11) unsigned NOT NULL AUTO_INCREMENT,
`clientId` int(11) NOT NULL,
`bookingDate` datetime NOT NULL,
`serviceId` int(11) NOT NULL,
`providerId` int(11) DEFAULT NULL,
`startDateTime` datetime NOT NULL,
`endDateTime` datetime NOT NULL,
PRIMARY KEY (`bookingId`)
)
1 1 2014-10-16 1 101 2014-10-17 10:30:00 2014-10-17 10:59:59
当然还有更多的客户、付款等表被加入 进入搜索。
我的问题是搜索每个提供商的未预订可用服务。
假设有人想要安娜剪头发。然后我想介绍一下可以安排的理发时间,不包括已经预订的 10:30:00。
select s.serviceId, s.providerId, s.scheduleStartDateTime, s.scheduleEndDateTime
FROM schedule AS s
WHERE s.serviceId = '1'
AND s.providerId NOT IN
(
SELECT providerId
FROM bookings
WHERE startDateTime <= s.scheduleEndDateTime
AND endDateTime >= s.scheduleStartDateTime
)
但是这个搜索给出了这个结果:
1 101 2014-10-17 10:00:00 2014-10-17 10:29:59
1 101 2014-10-17 10:30:00 2014-10-17 10:59:59 <-- This should not show up
1 101 2014-10-17 11:00:00 2014-10-17 11:29:59
1 101 2014-10-17 11:30:00 2014-10-17 11:59:59
1 101 2014-10-17 12:00:00 2014-10-17 12:29:59
最佳答案
我认为你的 SQL 应该是这样的:
select s.serviceId, s.providerId, s.scheduleStartDateTime, s.scheduleEndDateTime
FROM schedule AS s
WHERE s.serviceId = '1'
AND s.providerId NOT IN
(
SELECT b.providerId
FROM bookings AS b
WHERE b.startDateTime >= s.scheduleEndDateTime
AND b.endDateTime <= s.scheduleStartDateTime
)
子查询应该选择已预订的,因此主查询将排除这些已预订的。
阿纳斯
关于php - 检查 MySQL 中的日期范围,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26399609/