【发布时间】:2019-03-19 17:48:06
【问题描述】:
我有一个足球比赛列表,定义如下:
id | datetime | status | gameweek | round_id | home_team_id
1 2019-03-31 00:00:00 1 29 12696 1243
2 2019-03-31 00:00:00 1 29 12696 1248
3 2019-03-31 00:00:00 1 29 12696 1242
4 2019-03-31 00:00:00 1 29 12696 1246
5 2019-03-31 00:00:00 1 29 12696 1244
6 2019-03-31 00:00:00 1 29 12696 1247
7 2019-03-31 20:30:00 1 29 12696 1241
8 2019-03-31 00:00:00 1 29 12696 1249
9 2019-03-31 00:00:00 1 29 12696 2981
10 2019-03-31 00:00:00 1 29 12696 1259
我需要将所有具有gameweek 和下一个gameweek 的matches 归还给已完成的matches,而不是全部。
一些rounds 没有任何gameweek,所以在这种情况下应该返回所有matches,在完成的match 旁边有一个datetime。
我写的查询是这样的:
Select m.* from `match` m where round_id = 12696 and m.datetime = (SELECT COALESCE(MIN(CASE WHEN m2.status < 5 THEN m2.datetime END), MAX(m2.datetime)) FROM `match` m2 WHERE m2.round_id = m.round_id)
这个只返回9条记录,我不明白为什么,唯一的原因是一条记录也有时间。
finishedmatches 是什么意思?
对于matches 结束或完成,我的意思是每个match 的状态是5 或3。 1 的状态表示match 已预定,但尚未播放; 5 表示 finished 和 3 已取消。
例如:
id | datetime | status | gameweek | round_id | home_team_id
1 2019-03-20 00:00:00 5 29 12696 1243
2 2019-03-20 00:00:00 5 29 12696 1248
3 2019-03-20 00:00:00 5 29 12696 1242
4 2019-03-31 00:00:00 1 29 12696 1246
5 2019-03-31 00:00:00 1 29 12696 1244
6 2019-03-31 00:00:00 1 29 12696 1247
7 2019-03-31 20:30:00 1 29 12696 1241
8 2019-03-31 00:00:00 1 29 12696 1249
9 2019-03-31 00:00:00 1 29 12696 2981
10 2019-03-31 00:00:00 1 29 12696 1259
如您所见,前三张唱片已经播放完毕。在这种情况下,查询需要返回所有matches(已播放和预定),因为gameweek 29 还包含其他尚未播放的matches,因此预期结果是所有10 条记录。
预期结果:1、2、3、4、5、6、7、8、9、10
另外重要的是有些round没有gameweek,所以假设这样,我们需要返回即将到来的matches,例如:
id | datetime | status | gameweek | round_id | home_team_id
1 2019-03-20 00:00:00 5 NULL 12696 1243
2 2019-03-20 00:00:00 5 NULL 12696 1248
3 2019-03-20 00:00:00 5 NULL 12696 1242
4 2019-03-31 00:00:00 1 NULL 12696 1246
5 2019-03-31 00:00:00 1 NULL 12696 1244
6 2019-03-31 00:00:00 1 NULL 12696 1247
7 2019-03-31 20:30:00 1 NULL 12696 1241
8 2019-03-31 00:00:00 1 NULL 12696 1249
9 2019-03-31 00:00:00 1 NULL 12696 2981
10 2019-03-31 00:00:00 1 NULL 12696 1259
预期结果:4、5、6、7、8、9、10
(在小提琴中缺少记录 7)。
如果没有gameweeks,但所有matches都已完成(状态5),那么我们需要返回最新datetime的所有matches,例如:
id | datetime | status | gameweek | round_id | home_team_id
1 2019-03-20 00:00:00 5 NULL 12696 1243
2 2019-03-20 00:00:00 5 NULL 12696 1248
3 2019-03-20 00:00:00 5 NULL 12696 1242
4 2019-03-31 00:00:00 5 NULL 12696 1246
5 2019-03-31 00:00:00 5 NULL 12696 1244
6 2019-03-31 00:00:00 5 NULL 12696 1247
7 2019-03-31 20:30:00 5 NULL 12696 1241
8 2019-03-31 00:00:00 5 NULL 12696 1249
9 2019-04-05 00:00:00 5 NULL 12696 2981
10 2019-04-05 00:00:00 5 NULL 12696 1259
预期结果:9、10
id | datetime | status | gameweek | round_id | home_team_id
1 2019-03-20 00:00:00 5 28 12696 1243
2 2019-03-20 00:00:00 5 28 12696 1248
3 2019-03-20 00:00:00 1 28 12696 1242
4 2019-03-31 00:00:00 1 28 12696 1246
5 2019-04-05 00:00:00 5 29 12696 1244
6 2019-04-05 00:00:00 5 29 12696 1247
7 2019-04-05 20:30:00 5 29 12696 1241
8 2019-04-05 00:00:00 5 29 12696 1249
预期结果: 1,2,3,4,
我在这里创建了一个fiddle,它涵盖了所有情况。
【问题讨论】:
-
你应该澄清你的问题:“在完成的比赛旁边”是什么意思?你能举一些例子吗?如果是过去,不是所有的比赛都结束了,如果在未来,不是所有的比赛都没有结束吗?您的查询示例不可能是正确的,因为没有定义 m2。目前还不是很清楚您要达到的目标。
-
@Dinu 嗨,感谢您对这个问题感兴趣。我用我错过的其他一些细节更新了这个问题,对此感到抱歉。如果您有任何其他问题,请告诉我,我也会澄清。
-
@sfarzoso:我相信,真正有帮助的是提供一组数据,这些数据通常代表您的用例,以及相应的结果期待。如果要求太复杂,可能需要几组样本数据/预期输出。
-
@sfarzoso ,我很想知道.. “这仅返回 8 条记录,我不明白为什么” .. 这 8 条记录是否返回正确数据?
-
好吧,伙计们,我更新了问题,使其更清晰,我还添加了一个小提琴:dbfiddle.uk/…,涵盖了所有案例,如果您对该问题还有其他问题,请告诉我