【问题标题】:how do i get the correct id with the query results如何通过查询结果获取正确的 ID
【发布时间】:2020-09-22 04:49:00
【问题描述】:

我想在 MySQL 中创建一个存储过程,但首先,我想获得正确的查询。但是,我一直遇到的问题是,我似乎无法从查询中获取与我返回的 DateTime 标记相对应的正确 id。

这是我试图从中获取结果的表:

id  EventId   start                 end
1   1         2019-04-05 00:00:00   2019-04-07 00:00:00
2   2         2020-04-03 00:00:00   2020-04-03 00:00:00
3   3         2020-04-02 00:00:00   2020-04-02 00:00:00
7   1         2020-06-11 00:00:00   2020-06-11 00:00:00
9   2         2020-06-18 00:00:00   2020-06-18 00:00:00
10  3         2020-06-11 00:00:00   2020-06-11 00:00:00
11  3         2020-06-07 00:00:00   2020-06-07 00:00:00

查询:

SELECT DISTINCT Eventid, MIN(start), id
from date_planning
WHERE `start` >= NOW()
GROUP BY Eventid

这给了我以下结果

EventId   Min(start)            id
1         2020-06-11 00:00:00   3
2         2020-06-18 00:00:00   9
3         2020-06-07 00:00:00   10

但这些是属于这些日期时间的正确 id:

EventId   Min(start)            id
1         2020-06-11 00:00:00   7
2         2020-06-18 00:00:00   9
3         2020-06-07 00:00:00   11

【问题讨论】:

  • 您通常GROUP BY 与您SELECT 相同的列,除了那些是设置函数的参数的列。除非在兼容模式下,否则您的查询将在较新的 MySQL 版本中引发异常。
  • 但是,当前的 MySQL 有窗口函数。检查出来。

标签: mysql sql date greatest-n-per-group


【解决方案1】:

您想要每个eventId 的“未来”日期最短的行。要解决这个每组最大 n 的问题,您需要过滤而不是聚合。这是使用相关子查询的一个选项:

select dt.*
from date_planning dt
where dt.start = (
    select min(dt1.start)
    from date_planning dt1
    where dt1.eventId = dt.eventId and dt1.start >= now()
)

为了提高性能,您需要在(eventId, start) 上建立索引。

【讨论】:

    猜你喜欢
    • 2018-07-29
    • 2017-11-19
    • 1970-01-01
    • 2017-02-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-04
    相关资源
    最近更新 更多