我想弄到下周比赛的比赛。游戏周是指当比赛开始时,我们可以有以下几种游戏周:20,21,22,23。每个游戏周都有一个特定的日期。现在所有的比赛都有一个特定的状态,如果状态值是5,我可以看到一个特定游戏周的比赛是否进行了,相反,如果没有进行,可以有状态:1,2,3,4。
我的查询具有以下设计:
SELECT m.id, m.round_id, m.datetime,
CASE m.status
WHEN 1 THEN 'scheduled'
WHEN 2 THEN 'postponed'
WHEN 3 THEN 'canceled'
WHEN 4 THEN 'playing'
WHEN 5 THEN 'finished'
END AS match_status,
m.gameweek, m.home_team_id, m.home_team_half_time_score, m.home_team_score,
m.home_extra_time, m.home_penalties, m.away_team_id, m.away_team_half_time_score,
m.away_team_score, m.away_extra_time, m.away_penalties, m.venue_id,
m.venue_attendance, m.aggregate_match_id,
t.name AS home_team_name,
t_info.shield_link AS home_team_shield,
t2.name AS away_team_name,
t2_info.shield_link AS away_team_shield,
c.name AS competition_name,
c.id AS competition_id,
r.name AS round_name
FROM `match` m
LEFT JOIN team t ON m.home_team_id = t.id
LEFT JOIN team_info t_info ON t.id = t_info.team_id
LEFT JOIN team t2 ON m.away_team_id = t2.id
LEFT JOIN team_info t2_info ON t2.id = t2_info.team_id
LEFT JOIN competition_rounds r ON m.round_id = r.id
LEFT JOIN competition_seasons s ON r.season_id = s.id
LEFT JOIN competition c ON c.id = s.competition_id
WHERE 1 AND m.status IN (1, 2, 3, 4, 5) AND m.round_id IN (10, 488, 392, 70)
AND m.gameweek = (SELECT MAX(m2.gameweek)
FROM `match` m2 WHERE m2.round_id = m.round_id AND m2.status = m.status)
ORDER BY m.datetime DESC LIMIT 10
主要问题和数据结构
主要问题:游戏周。我想返回已经玩过的比赛的下一个游戏周,因此假设我有以下比赛:
| id | round.id | status | gameweek | date
1 488 5 1 1/07/2018
2 488 5 1 1/07/2018
3 488 5 1 1/07/2018
4 488 1 2 7/07/2018
5 488 1 2 7/07/2018
6 488 1 2 7/07/2018
7 488 1 3 16/07/2018
8 488 1 3 16/07/2018
9 488 1 3 16/07/2018
我的查询将返回匹配id:7、8、9。但是应该返回:4,5,6,因为是下一个需要玩的游戏周,游戏周1已经完全玩了。
请注意,例如,如果在gameweek 1中几乎有一个匹配尚未进行,则查询应返回gameweek 1而不是gameweek 2。
我怎样才能解决这个问题?
谢谢。
更多详细信息
在查询的第一部分中,我只选择希望从联接表返回的字段。使用存储所有匹配项的主表match进行选择。我有table上的球队和球队的联合信息,这需要两个队的信息,打比赛。
在这之后,我参加了比赛,获得了这一轮的细节,这一轮只是比赛的一个组织,赛季也是如此,例如:
round.name = Regular Season | season.id = 5 season.name = 2017/2018 | id = 5
这在这个问题上并不重要,但我试图解释所有的查询活动。
在where子句中,我得到所有匹配项,这些匹配项的状态为所有可用状态,即:1、2、3、4、5(您可以在查询字段选择器案例中找到状态描述)。后来我还有一个过滤器,它返回这些回合中的所有匹配:10、488、392、70。
2条答案
按热度按时间dba5bblo1#
你的情况始于
WHERE 1 AND m.status IN (1, 2, 3, 4, 5)
在我看来1 AND
被评估为TRUE AND
并不是限制你的结果-这是多余的。同样适用于条件status in (1,2,3,4,5)
-如果只有这些值可以在状态中设置-正如您所解释的。您执行的查询:将游戏周等于具有相同轮次id和状态的最大游戏周的条目提供给我。因此,如果存在具有相同状态的其他游戏周,则结果将过滤到该状态的最后一周。在您的特殊情况下,一周内的所有比赛都具有相同的状态。
您要执行的查询:从至少有一个状态条目小于5的所有游戏周列表中,为我提供最小游戏周。
因此,您只希望筛选出下一个游戏周,因此将使用另一个子查询:
ffdz8vbo2#
考虑以下几点:
对于玩所有游戏的情况,我想你可以这样做-尽管可能有一个更优雅的解决方案。。。