我如何通过查询结果获得正确的 ID
how do i get the correct id with the query results
我想在 MySQL 中创建一个存储过程,但首先,我想获得正确的查询。但是,我一直遇到这样的问题,即我似乎无法从我的查询中获取与我返回的日期时间戳相对应的正确 ID。
这是 table 我试图从中获取结果:
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
您想要每个 eventId
具有最小 "future" 日期的行。要解决这个 greatest-n-per-group 问题,您需要过滤而不是聚合。这是使用相关子查询的一个选项:
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)
上建立索引。
我想在 MySQL 中创建一个存储过程,但首先,我想获得正确的查询。但是,我一直遇到这样的问题,即我似乎无法从我的查询中获取与我返回的日期时间戳相对应的正确 ID。
这是 table 我试图从中获取结果:
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
您想要每个 eventId
具有最小 "future" 日期的行。要解决这个 greatest-n-per-group 问题,您需要过滤而不是聚合。这是使用相关子查询的一个选项:
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)
上建立索引。