MySQL:控制在 Group BY 查询中返回哪一行
在 MySQL 中,从每个组中检索具有最高值的行是一项共同的任务。但是,将标准 GROUP BY 子句与 ORDER BY 一起使用有时会导致意外结果。
为了实现此目的,我们可以采用替代方法来覆盖默认分组行为:
子查询方法:
该方法涉及创建一个子查询来获取每个唯一的最大version_id id:
SELECT * FROM (SELECT id, MAX(version_id) AS version_id FROM table GROUP BY id) t1 INNER JOIN table t2 ON (t2.id = t1.id AND t1.version_id = t2.version_id)
此查询将原始表与子查询连接起来,该子查询为每个 id 选择最大 version_id。连接确保仅返回具有最高 version_id 的行。
使用 ORDER BY 技巧的子查询:
子查询方法的一种变体涉及在子查询以确保特定的排序:
SELECT * FROM (SELECT * FROM table ORDER BY version_id DESC) t1 GROUP BY t1.id
此查询有效地按降序对行进行排序在执行分组之前,确保每个组中保留 version_id 最高的行。
命名 Windows 函数:
窗口函数允许计算在窗口定义的一组行中执行,可用于此任务:
SELECT * FROM ( SELECT *, ROW_NUMBER() OVER (PARTITION BY id ORDER BY version_id DESC) AS rn FROM table ) t WHERE rn = 1
此查询计算行ROW_NUMBER 定义的分区内每个唯一 ID 的编号。 WHERE 子句过滤掉行号不为 1 的行,确保仅返回每个 id 具有最高 version_id 的行。
以上是MySQL中如何选择每组中值最高的行?的详细内容。更多信息请关注PHP中文网其他相关文章!