MySQL中用MAX()获取最大值行却返回最小值行的解决方法
获取phd_ratio最大值对应的行记录
你原来的SQL语句SELECT * FROM rank HAVING max(phd_ratio)逻辑有误:HAVING是配合GROUP BY过滤分组结果的,单独使用时数据库会把全表作为一个分组,SELECT *会返回分组内的任意一行(这里恰好返回了第一行),而HAVING max(phd_ratio)只是判断分组存在最大值(永远为真),所以无法筛选出目标行。
以下是几种正确的实现方式:
方法一:排序后取首行(适合只需要一行最大值记录)
SELECT * FROM rank ORDER BY phd_ratio DESC LIMIT 1;原理:先按
phd_ratio降序排列,再取排序后的第一行,就是值最大的那一行。如果有多个行的phd_ratio同为最大值,此方法仅返回其中一行。方法二:子查询匹配最大值(支持返回所有最大值记录)
SELECT * FROM rank WHERE phd_ratio = (SELECT MAX(phd_ratio) FROM rank);原理:先通过子查询获取
phd_ratio的最大值,再筛选出表中所有phd_ratio等于该值的行,适合存在多个最大值记录的场景。方法三:窗口函数(适合复杂场景,需数据库支持窗口函数)
适用于MySQL 8.0+、PostgreSQL等支持窗口函数的数据库:SELECT * FROM ( SELECT *, RANK() OVER(ORDER BY phd_ratio DESC) AS rank_num FROM rank ) AS temp_table WHERE rank_num = 1;原理:用
RANK()窗口函数为每行标记排序位次,最大值行的位次为1,筛选出位次为1的行即可。如果使用ROW_NUMBER()替代RANK(),则仅返回一行最大值记录(位次唯一);RANK()会保留并列的最大值行。
内容的提问来源于stack exchange,提问作者Anas
相关产品推荐
相关产品推荐

