mysql - 在一个表中查找重叠的(日期/时间)行

标签 mysql

我有一个表格,在每一行中存储一个包含开始日期/时间和结束日期/时间的 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

确保您在 meetingStartmeetingEnd 上有索引,以便查询有效地工作。

然而,

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/

相关文章:

MySQL索引获取用于范围的2列之间的记录

php - Mysql删除一行php

mysql - 连接并到列

mysql - 使用聚集索引重新排列表中的记录

mysql - group_concat 结果在 IN 条件下不起作用

javascript - Node Promise 与 node-mysql 不会让应用程序终止

mysql - 无法解决 MySQL 错误 #1064

php - 如何使用 NOT IN 从多个表中删除行

python - 从多个连接中选择特定的mysql连接

php - 从 mysql 表生成列和行。数组操作将行显示为列并填充 "cells"