coalesce在左连接上返回非聚合异常

ggazkfy8  于 2021-06-21  发布在  Mysql
关注(0)|答案(1)|浏览(283)

我想弄到下周比赛的比赛。游戏周是指当比赛开始时,我们可以有以下几种游戏周:20,21,22,23。每个游戏周都有一个特定的日期。现在所有的比赛都有一个特定的状态,如果状态值是5,我可以看到一个特定游戏周的比赛是否进行了,相反,如果没有进行,可以有状态:1,2,3,4。
主要问题和数据结构
主要问题:游戏周。我想返回已经玩过的比赛的下一个游戏周,因此假设我有以下比赛:

| 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

结果应该是:7,8,9,我的实际查询正确地返回了这个结果,但是假设 matches 作为 status 5(所有 matches 已播放),查询将返回空结果。
所以我试着在最后一天处理这种情况 gameweek (如果所有 matchesround 但我得到:
sqlstate[42000]:语法错误或访问冲突:1140在没有group by的聚合查询中,select列表的表达式#1包含未聚合的列“y.gameweek”;这与sql\u mode=only\u full\u group by不兼容
我的问题是:

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 (:round_id1) AND m.gameweek = (SELECT COALESCE(y.gameweek, MAX(x.gameweek)) gameweek
  FROM `match` x
  LEFT JOIN
  (SELECT MIN(gameweek) gameweek
     FROM `match`
    WHERE status < 5
  ) y ON y.gameweek = x.gameweek ) ORDER BY m.datetime DESC LIMIT 10

我怎样才能解决这个问题?
谢谢。
更多详细信息
在查询的第一部分中,我只选择希望从联接表返回的字段。使用存储所有匹配项的主表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。

lf5gs5x2

lf5gs5x21#

这是导致问题的查询部分:

m.gameweek = (SELECT COALESCE(y.gameweek, MAX(x.gameweek)) gameweek
              FROM `match` x LEFT JOIN
                   (SELECT MIN(gameweek) gameweek
                    FROM `match`
                    WHERE status < 5
                   ) y
                   ON y.gameweek = x.gameweek
             )

问题是 y.gameweek 未聚合。你可以通过添加 GROUP BY y.gameweek :

m.gameweek = (SELECT COALESCE(y.gameweek, MAX(x.gameweek)) gameweek
              FROM `match` x LEFT JOIN
                   (SELECT MIN(gameweek) gameweek
                    FROM `match`
                    WHERE status < 5
                   ) y
                   ON y.gameweek = x.gameweek
              GROUP BY y.gameweek
             )

但是,更简单的表达式是:

m.gameweek = (SELECT m2.gameweek
              FROM `match` m2
              ORDER BY (status < 5) DESC,
                       (CASE WHEN status < 5 THEN gameweek END) ASC,
                       gameweek DESC
              LIMIT 1
             )

的第一个键 ORDER BY 将行与 status < 5 第一。第二个命令是 gameweek 按升序排列。所以,结果是第一行 status < 5 最小值为 gameweek .
所有这些都不存在,然后第三个键开始起作用,您将获得最大值。
另一个版本使用条件聚合:

m.gameweek = (SELECT COALESCE(MIN(CASE WHEN m2.status < 5 THEN m2.gameweek END),
                              MAX(m2.gameweek)
                             )
              FROM `match` m2
             )

相关问题