MAX 在 WHERE 子句中返回所有记录

Posted

技术标签:

【中文标题】MAX 在 WHERE 子句中返回所有记录【英文标题】:MAX In WHERE clause return all the record 【发布时间】:2018-07-04 13:09:53 【问题描述】:

我正在尝试返回特定round 的可用matchMAX 游戏周,为此我使用了MAX 函数,但我得到了一轮的所有matches 游戏周,相反,我应该只获得具有 MAX 游戏周的 matches

这是我的查询:

  SELECT m.id, m.round_id, m.gameweek
  FROM `match` m
  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 = 5 AND m.round_id = 488 OR m.round_id = 489 OR m.round_id = 490 OR m.round_id = 491 
  AND m.gameweek = (SELECT MAX(gameweek) FROM `match` WHERE (round_id = 488) OR (round_id = 489) OR (round_id = 490) OR (round_id = 491))

结果是:

[
    
        "id": "1979011",
         "round_id": "488",
         "gameweek": "1",
    ,
    
        "id": "1979012",
        "round_id": "488",
        "gameweek": "2",
    ,
    
        "id": "1979013",
        "round_id": "489",
        "gameweek": "1",
    ,
    
        "id": "1979014",
        "round_id": "489",
        "gameweek": "2",
    ,

我只希望得到 id 为 1979012、1979014 的比赛。为什么我会得到所有比赛周数?

【问题讨论】:

x AND y OR z( x AND y ) OR z 相同,而不是x AND ( y OR z ) 【参考方案1】:

我认为你只需要括号。或者更好的是,使用in

WHERE 1 AND
      m.status = 5 AND
      m.round_id IN (488, 489, 490, 491) AND
      m.gameweek = (SELECT MAX(m2.gameweek)
                    FROM `match` m2
                    WHERE m2.round_id IN (488, 489, 490, 491)
                   )

我完全不清楚为什么要将这么多表连接在一起。您只引用来自 match 的列,因此这似乎是查询中唯一需要的表。

【讨论】:

感谢您的回答,在我简化查询的问题中,完整的查询如下所示:pastebin.com/RMKP29Pd 连接是为了从其他表中获取详细信息,无论如何,我使用了您的解决方案,但是我得到了确切的结果,也许你能看到一些我看不到的东西?再次感谢 好吧,我的错,我添加了m.round_id IN (488, 489, 490, 491),现在似乎工作了,但我现在有另一个问题,返回的匹配只对应于 488 轮 id,另一轮丢失..跨度> @Gordon,你能解释一下WHERE 1 AND吗?因为我认为这里不需要它。 @AnkitBajpai 。 . . 1 AND 在原始查询中。 我的问题到底是什么。为什么我们需要在这里使用AND 1。 1 表示真实。如果我们只使用对我们也有用的休息条件。 1 AND 1 表示正确。所以在这里显式使用1 AND没有任何意义。

以上是关于MAX 在 WHERE 子句中返回所有记录的主要内容,如果未能解决你的问题,请参考以下文章

sql删除重复记录

是否可以使用“WHERE”子句来选择 SQL 语句中的所有记录?

如何在where子句中使用max优化Oracle中的查询

通过在 where 子句中传递值来选择数据,如果值匹配则返回该数据,否则返回所有数据

在 WHERE IN 子句 SQL 中显示每条记录的 MAX 日期

7_mysql查询之where子句