Cup*_*ppy 6 mysql sql database
我在数据库中有2个表,具有以下属性:
Booking
=======
booking_id
booking_start
booking_end
resource_booked
===============
booking_id
resource_id
Run Code Online (Sandbox Code Playgroud)
第二个表是"预订"和"资源"之间的关联实体(即,1个预订可以包含许多资源).属性booking_start和booking_end是包含日期和时间的时间戳.
如果日期/时间与其他类似resource_id的预订重叠或冲突,我可以知道如何找到每个resource_id(resource_booked)吗?
我正在纸上涂抹答案,以图形方式,看看它是否可以帮助我想象我如何解决这个问题,我得到了这个:
我做了第1步,但第2步让我感到困惑!
我真的很感激任何帮助!谢谢!
编辑:我正在阅读Renshaw先生的答案,并尝试自己做一个,看看我是否理解,我得到了这个概念:
SELECT
a.*
FROM
(SELECT
b.creation_date,
b.booking_id,
r_b.resource_id,
b.booking_start,
b.booking_end
FROM Booking b
INNER JOIN resource_booked r_b ON b.booking_id = r_b.booking_id) as a,
(SELECT
b.booking_id,
r_b.resource_id,
b.booking_start,
b.booking_end
FROM Booking b INNER JOIN resource_booked r_b ON b.booking_id = r_b.booking_id) as
WHERE
a.resource_id = b.resource_id
AND
a.booking_id <> b.booking_id
AND
a.booking_start BETWEEN b.booking_start AND b.booking_end
AND
a.creation_date >= b.creation_date
Run Code Online (Sandbox Code Playgroud)
我想我正在尝试创建两个相同的表并使用resource_id连接它们,查找具有相似资源ID但不同booking_id的记录,并查看一个(booking_id)的booking_start日期时间是否在另一个(booking_id)的booking_start和booking_end之间.
它真的很乱,我甚至不确定我的询问是否在考虑我的想法但是有些奇迹,我得到了和Renshaw先生一样的答案!
编辑:使用附加信息,现在仅限于仅显示与某些早期预订冲突的预订。
我认为这会解决问题:
SELECT DISTINCT
b2.booking_id, -- The later booking
b2.booking_start,
b2.booking_end,
b2.creation_date,
rb1.resource_id, -- The resource over which the two bookings clash
b1.booking_id, -- The earlier booking
b1.booking_start,
b1.booking_end
FROM resource_booked rb1
INNER JOIN booking b1 ON b1.booking_id = rb1.booking_id
INNER JOIN booking b2 ON b1.booking_id <> b2.booking_id
AND b2.booking_start BETWEEN b1.booking_start AND b1.booking_end
INNER JOIN resource_booked rb2 ON rb2.resource_id = rb1.resource_id
AND rb2.booking_id = b2.booking_id
Run Code Online (Sandbox Code Playgroud)
这是它的测试方式:
use tempdb
drop table resource_booked
drop table Booking
create table Booking
(
booking_id int,
booking_start datetime,
booking_end datetime,
creation_date datetime
)
create table resource_booked
(
booking_id int,
resource_id int
)
insert Booking values (1, '1 january 2000', '1 march 2000', '1 january 2000')
insert Booking values (2, '1 february 2000', '1 may 2000', '2 january 2000')
insert Booking values (3, '1 april 2000', '1 june 2000', '3 january 2000')
insert Booking values (4, '1 july 2000', '1 august 2000', '4 january 2000')
insert resource_booked values (1, 1)
insert resource_booked values (2, 1)
insert resource_booked values (3, 1)
insert resource_booked values (4, 1)
insert resource_booked values (1, 2)
insert resource_booked values (3, 2)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1802 次 |
| 最近记录: |