子查询不返回预期结果

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 表获得了比赛赛季可用的所有roundsmatchround 上播放,所以我在match 表上使用INNER JOIN,因为我需要仅获取具有matchesrounds

比赛89有不同的赛季不同的回合,例如:

2017/2018 2016/2017 2015/2016

查询应该返回2017/2018,因为是最后一个赛季有matchMAX(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 BYLIMIT 会起作用:

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 赛季结果的示例数据?

以上是关于子查询不返回预期结果的主要内容,如果未能解决你的问题,请参考以下文章

MYSQL基础九--子查询和连接

(My)SQL:如果子查询不是空集,则返回子查询

具有多结果子查询的查询不适用于 jdbc

子查询时间比较

子查询不返回预期结果

子查询语法详解