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

MySQL查询:按STATUS条件拆分数据,满足主组特殊数量规则

MySQL查询实现主组(SET 1)数据筛选需求

先把咱们要实现的核心规则再明确下:

  • 主组(SET 1)**绝对不能包含REPROVED(STATUS=-1)**的数据
  • 所有APPROVED(STATUS=1)的数据必须全部纳入主组,哪怕数量超过5条
  • 如果APPROVED的数量不足5条,就从NEUTRO(STATUS=0)里补够5条

接下来直接上可以用的查询语句,假设你的表名叫your_table,记得替换成实际表名:

SELECT *
FROM (
    -- 先取所有APPROVED数据,标记最高优先级
    SELECT *, 1 AS priority FROM your_table WHERE STATUS = 1
    UNION ALL
    -- 再取NEUTRO数据,标记次优先级
    SELECT *, 2 AS priority FROM your_table WHERE STATUS = 0
) AS combined
ORDER BY priority ASC
-- 动态控制取数数量:APPROVED够5条就全拿,不够就补到5条
LIMIT CASE 
    WHEN (SELECT COUNT(*) FROM your_table WHERE STATUS = 1) >= 5 THEN (SELECT COUNT(*) FROM your_table WHERE STATUS = 1)
    ELSE 5
END;

语句逻辑拆解:

  1. 子查询用UNION ALL合并APPROVED和NEUTRO数据,通过priority字段确保APPROVED排在最前面,保证补NEUTRO时不会抢占APPROVED的位置
  2. 外层LIMIT配合CASE做动态判断:
    • 若APPROVED总数≥5,直接取全部APPROVED数据
    • 若APPROVED数量不足5,直接取5条数据(自然就是所有APPROVED + 剩余名额的NEUTRO)
  3. 全程未包含STATUS=-1的记录,自动排除了REPROVED数据

如果需要同时给所有数据标记所属分组(主组/其他组),可以用下面的语句:

SELECT 
    *,
    CASE
        -- 所有APPROVED直接归为主组
        WHEN STATUS = 1 THEN 'SET 1'
        -- NEUTRO仅在APPROVED不足5条时,按顺序补够名额归入主组
        WHEN STATUS = 0 AND (SELECT COUNT(*) FROM your_table WHERE STATUS = 1) < 5 
             AND ROW_NUMBER() OVER (PARTITION BY STATUS ORDER BY (SELECT NULL)) <= (5 - (SELECT COUNT(*) FROM your_table WHERE STATUS = 1))
        THEN 'SET 1'
        -- 其余数据归为第二组
        ELSE 'SET 2'
    END AS group_name
FROM your_table
-- 若需要把REPROVED归入SET 2,就去掉下面这句
WHERE STATUS != -1 
ORDER BY group_name ASC, STATUS DESC;

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 03:47:28