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

MariaDB中不使用ORDER BY查询列最低频次值的SQL实现问题

解决方案

可通过嵌套子查询结合MIN()聚合函数实现,完全不需要用到ORDER BY和LIMIT关键字,SQL语句如下:

SELECT lvl
FROM enrl
WHERE ayr = '2000/01' 
  AND pid = 'G500'
GROUP BY lvl
HAVING COUNT(*) = (
    -- 内层查询拿到所有符合条件层级的最小就读人数
    SELECT MIN(lvl_stu_count)
    FROM (
        -- 最内层统计每个层级的就读人数
        SELECT COUNT(*) AS lvl_stu_count
        FROM enrl
        WHERE ayr = '2000/01' 
          AND pid = 'G500'
        GROUP BY lvl
    ) AS lvl_count_stat
);

实现逻辑

  • 最内层子查询先过滤符合学年、项目ID的记录,按层级分组统计每个层级的就读人数
  • 第二层子查询用MIN()聚合函数直接拿到所有层级中的最小就读人数
  • 外层查询同样按层级分组统计人数后,通过HAVING子句筛选出人数等于最小人数的层级

补充说明

如果存在多个层级就读人数相同且均为最小值的情况,该语句会返回所有符合要求的层级,比ORDER BY + LIMIT的方案更贴合实际业务需求。
如果你的数据库支持窗口函数,且规则允许窗口函数内使用ORDER BY(一般禁止的是顶层查询的排序子句),也可以用如下写法:

SELECT DISTINCT lvl
FROM (
    SELECT 
        lvl,
        RANK() OVER(ORDER BY COUNT(*)) AS rk
    FROM enrl
    WHERE ayr = '2000/01' 
      AND pid = 'G500'
    GROUP BY lvl
) AS t
WHERE rk = 1;

内容的提问来源于stack exchange,提问作者Lori9

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 22:45:01