You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 05:33:14