子查询不返回预期结果
Posted
技术标签:
【中文标题】子查询不返回预期结果【英文标题】:Sub-Query doesn't return expected result 【发布时间】:2018-07-04 19:18:07 【问题描述】:我正在尝试获取具有match
最大日期的season.id
。
查询是这样的:
SELECT s.id AS season_id,
s.name AS season_name,
s.competition_id AS competition_id
FROM competition_seasons s
INNER JOIN competition_rounds r ON r.season_id = s.id
INNER JOIN `match` m ON m.round_id = r.id
WHERE s.competition_id = 89
AND m.datetime = (SELECT MAX(m.datetime) FROM `match` m WHERE m.round_id = r.id)
GROUP BY s.id
如您所见,我有一个名为 competition_seasons
的表,其中包含可用于比赛的所有赛季,在此表上我获得了比赛的所有信息,在这种情况下,比赛的 ID 为 89
。
后来我通过competition_rounds
表获得了比赛赛季可用的所有rounds
,match
在round
上播放,所以我在match
表上使用INNER JOIN
,因为我需要仅获取具有matches
的rounds
。
比赛89
有不同的赛季不同的回合,例如:
查询应该返回2017/2018
,因为是最后一个赛季有match
和MAX(m.datetime)
这个字段表示比赛的开始时间,一个match
在这个赛季进行的2017/2018
意味着有一个可以从 2017 年开始到 2018 年结束的日期(因此在赛季的两年内)。
查询的结果反而是2011,完全没有意义。
我在查询中做错了什么?
competition_seasons
| id | name | competition_id
1 2017/2018 89
2 2016/2017 89
3 2015/2016 89
competition_rounds
| id | name | season_id
1 First 1
2 Second 1
3 First 2
4 Second 2
5 First 3
匹配
|id | datetime | round_id
1 2018-03-08 00:00:0 1
2 2017-09-10 20:30:0 1
3 2017-04-18 15:30:0 3
4 2016-03-08 00:00:0 3
5 2015-04-08 00:00:0 4
6 2015-05-08 00:00:0 5
预期结果:season_id = 1,因为本赛季的 match
的字段 datetime
比前几个赛季大。
【问题讨论】:
您能提供一些示例数据并期待结果吗? 请提供一些数据和预期结果。另外,“季节”是什么类型(例如2017/2018
)?
@D-Shih 请检查我的更新,我添加了描述数据类型和情况的示例数据
【参考方案1】:
我认为ORDER BY
和LIMIT
会起作用:
SELECT s.id AS season_id, s.name AS season_name,
s.competition_id AS competition_id
FROM competition_seasons s INNER JOIN
competition_rounds r
ON r.season_id = s.id INNER JOIN
`match` m
ON m.round_id = r.id
WHERE s.competition_id = 89
ORDER BY m.datetime DESC
LIMIT 1;
【讨论】:
【参考方案2】:试试这个:
SELECT s.id AS season_id,
s.name AS season_name,
s.competition_id AS competition_id
FROM competition_seasons s
INNER JOIN competition_rounds r ON r.season_id = s.id
INNER JOIN `match` m ON m.round_id = r.id
WHERE s.competition_id = 89
AND m.datetime = (SELECT MAX(m1.datetime) FROM `match` m1
INNER JOIN competition_rounds r1
ON m1.round_id = r1.id
INNER JOIN competition_seasons s1
ON r1.season_id = s1.id
AND s1.competition_id = 89)
【讨论】:
这会返回与我在问题中写的相同的结果.. 2011 您能否填写 2011 赛季结果的示例数据?以上是关于子查询不返回预期结果的主要内容,如果未能解决你的问题,请参考以下文章