【问题标题】:SQL: Get nearest N rows with respect to datetimeSQL:获取相对于日期时间最近的 N 行
【发布时间】:2019-11-20 10:30:34
【问题描述】:

考虑一个包含会议数据的表,每个会议都与一个主会议相关联。 示例:

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 之前使用 limit 获取行

编辑:编辑 start_at 的真实表值 编辑 2:添加了 SQL Fiddle

【问题讨论】:

标签: mysql sql


【解决方案1】:

不清楚您所说的“最近的会议”是什么意思。我假设您需要与给定会议 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))

【讨论】:

  • 谢谢,必须限制 n+1。但是有没有办法通过 start_at 对结果进行排序? :D
  • @SahithVibudhi,只需在末尾添加, m2.start_at :)
  • 感谢您的帮助。采纳答案! ?
  • 不客气@SahithVibudhi,但实际上你已经接受了另一个答案:D
【解决方案2】:

您可以通过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

Demo on SQLFiddle

【讨论】:

  • 2 个联接,1 个联合。这给出了所需的输出。但是,有没有有点贵的版本? :D
  • 这将尽可能高效,因为我们只查看来自同一 master_meeting_id 的值。如果您只想要最近的会议无论它们是在指定会议之前还是之后,您都可以使用@Stalinko 回答。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多