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;
语句逻辑拆解:
- 子查询用
UNION ALL合并APPROVED和NEUTRO数据,通过priority字段确保APPROVED排在最前面,保证补NEUTRO时不会抢占APPROVED的位置 - 外层
LIMIT配合CASE做动态判断:- 若APPROVED总数≥5,直接取全部APPROVED数据
- 若APPROVED数量不足5,直接取5条数据(自然就是所有APPROVED + 剩余名额的NEUTRO)
- 全程未包含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
相关产品推荐
相关产品推荐

