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_start
和 session_end
之间的时间间隔从不重叠不同的行。每个会话指的是两个用户之间交换消息的聊天对话。
我还有一个 mongoDB,其中,对于每个文档,我存储的文本消息带有 date/timestamp 接收时间,称之为 event_date
。但是,文档没有说明消息属于哪个会话。因此,我们可以将 mongoDB 文档与 mysql table 中的会话匹配的唯一方法是 event_date
在 session_start
和 session_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)
让我再详细解释一下...
我有一个 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_start
和 session_end
之间的时间间隔从不重叠不同的行。每个会话指的是两个用户之间交换消息的聊天对话。
我还有一个 mongoDB,其中,对于每个文档,我存储的文本消息带有 date/timestamp 接收时间,称之为 event_date
。但是,文档没有说明消息属于哪个会话。因此,我们可以将 mongoDB 文档与 mysql table 中的会话匹配的唯一方法是 event_date
在 session_start
和 session_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)