假设有会议数据的表,每次会议都与主会议相关联。示例:
meeting_id | master_meeting_id | start_at |
1sq | a | 2019-01-03 11:30:00 |
2cd | b | 2019-01-01 10:30:00 |
3as | a | 2019-02-03 11:30:00 |
4cd | d | 2019-02-03 12:30:00 |
dw5 | a | 2019-03-03 11:30:00 |
6ds | a | 2019-04-03 11:30:00 | SQL:http://sqlfiddle.com/#!9/79638a/1
给定meeting_id,如何在single SQL查询中获取绑定到同一个master_meeting_id的最近(通过start_at)的会议?
示例:
输入:
meeting_id=3as
N=1
输出:
meeting_id | master_meeting_id | start_at |
1sq | a | 2019-01-03 11:30:00 |
3as | a | 2019-02-03 11:30:00 |
dw5 | a | 2019-03-03 11:30:00 |注意:我使用MySQL
到目前为止,我尝试过的是:使用两个SQL查询,一个用于在start_at之后获取相关行,另一个用于在start_at使用限制之前获取行。
编辑:为start_at编辑2编辑实表值:添加SQL
发布于 2019-11-20 10:48:52
您可以使用查询的UNION获得所需的结果,以便在指定的会议上或之前生成N+1会议(因此包括指定的会议)和在指定的会议上或之后产生N+1会议:
(SELECT m1.*
FROM meetings m1
JOIN meetings m2 ON m2.master_meeting_id = m1.master_meeting_id
AND m2.meeting_id = '3as'
AND m1.start_at <= m2.start_at
ORDER BY m1.start_at DESC
LIMIT 2)
UNION
(SELECT m1.*
FROM meetings m1
JOIN meetings m2 ON m2.master_meeting_id = m1.master_meeting_id
AND m2.meeting_id = '3as'
AND m1.start_at >= m2.start_at
ORDER BY m1.start_at ASC
LIMIT 2)
ORDER BY start_at输出:
meeting_id master_meeting_id start_at
1sq a 2019-01-03T11:30:00Z
3as a 2019-02-03T11:30:00Z
dw5 a 2019-03-03T11:30:00Z基于SQLFiddle的演示
发布于 2019-11-20 10:42:17
你说的“最近的会议”是什么意思还不清楚。我假设您需要与给定的会议ID最接近的会议。
SELECT m2.*
FROM meetings m1
JOIN meetings m2 ON m1.master_meeting_id = m2.master_meeting_id
WHERE m1.id = "given meeting ID"
ORDER BY ABS(UNIX_TIMESTAMP(m1.start_at) - UNIX_TIMESTAMP(m2.start_at))https://stackoverflow.com/questions/58952160
复制相似问题