MySQL 使用 >= 和 <= 条件匹配多行的查询

MySQL query for matching multiple rows with >= and <= conditions

让我再详细解释一下...

我有一个 mysql table 这样的:

| session_id | session_start       | session_end         |
|------------|---------------------|---------------------|
| 1          | 2016-01-01 01:00:00 | 2016-01-01 01:03:00 |
| 2          | 2016-01-01 03:00:00 | 2016-01-01 03:02:24 |
| 3          | 2016-01-01 03:35:00 | 2016-01-01 03:37:02 |
| ...        | ...                 | ...                 |

其中 session_startsession_end 之间的时间间隔从不重叠不同的行。每个会话指的是两个用户之间交换消息的聊天对话。

我还有一个 mongoDB,其中,对于每个文档,我存储的文本消息带有 date/timestamp 接收时间,称之为 event_date。但是,文档没有说明消息属于哪个会话。因此,我们可以将 mongoDB 文档与 mysql table 中的会话匹配的唯一方法是 event_datesession_startsession_end 之间在 mysql 中获取一些记录,然后检索 session_id.

我目前的解决方案是运行宁这样的查询(为此我在python和mysql库中工作),在伪代码中:

for event_date in all_event_dates:
    cursor.execute("SELECT session_id
         FROM session_table
         WHERE %s >= session_start
           AND %s <= session_end",
        (event_date, event_date))
    row = cursor.fetchone()

但这是一个非常缓慢的过程,因为列表 all_event_dates 的长度大约为 100k。有没有更有效的查询,我可以 运行 它一次用于多个 event_date 值?

非常感谢

将所有事件日期加载到临时 table,然后加入其中。

cursor.execute("CREATE TEMPORARY TABLE event_dates (event_date DATETIME)";
cursor.executemany("INSERT INTO event_dates VALUES (?)", [(date,) for date in all_event_dates])
connection.commit()
cursor.execute("""
    SELECT session_id 
    FROM session_table AS s
    JOIN event_dates AS e ON e.event_date BETWEEN s.session_start AND s.session_end""")
rows = cursor.fetchall()

因为它们不重叠,所以

SELECT session_id
     FROM session_table
     WHERE %s >= session_start
     ORDER BY session_start
     LIMIT 1

并在 table 上有这个:

INDEX(session_start, session_id)