我有一个表格,在每一行中存储一个包含开始日期/时间和结束日期/时间的 session 。
session ID整数
session 开始日期时间
session 结束日期时间
期望的输出:
对于每对重叠的行,我想输出
session ID、 session 开始、 session ID、 session 结束
在 MySQL 中执行此类查询的最有效方法是什么?
最佳答案
SELECT m1.meetingID, m1.meetingStart, m1.meetingEnd, m2.meetingID
FROM t_meeting m1, t_meeting m2
WHERE (m2.meetingStart BETWEEN m1.meetingStart AND m1.meetingEnd
OR m2.meetingEnd BETWEEN m1.meetingStart AND m1.meetingEnd)
AND m1.meetingID <> m2.meetingID
这将选择每对两次。
如果您希望每对只选择一次,请使用:
SELECT m1.meetingID, m1.meetingStart, m1.meetingEnd, m2.meetingID
FROM t_meeting m1, t_meeting m2
WHERE (m2.meetingStart BETWEEN m1.meetingStart AND m1.meetingEnd
OR m2.meetingEnd BETWEEN m1.meetingStart AND m1.meetingEnd)
AND m2.meetingID > m1.meetingID
确保您在 meetingStart
和 meetingEnd
上有索引,以便查询有效地工作。
MySQL
可能会使用 INDEX MERGE
来运行此查询,这在当前实现中效率不高。
您也可以尝试使用:
SELECT m1.*, m2.*
FROM (
SELECT m1.meetingID AS mid1, m2.meetingID AS mid2
FROM t_meeting m1, t_meeting m2
WHERE m2.meetingStart BETWEEN m1.meetingStart AND m1.meetingEnd
AND m2.meetingID <> m1.meetingID
UNION
SELECT m1.meetingID, m2.meetingID
FROM t_meeting m1, t_meeting m2
WHERE m2.meetingEnd BETWEEN m1.meetingStart AND m1.meetingEnd
AND m2.meetingID <> m1.meetingID
) mo, t_meeting m1, t_meeting m2
WHERE m1.meetingID = mid1
AND m2.meetingID = mid2
,它更复杂,但很可能会运行得更快一些。
关于mysql - 在一个表中查找重叠的(日期/时间)行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/689458/