一种借助MYSQL递归CTE生成所有组合情况的实现方法

需求说明

有如下表和数据:

|---|---------|
| N | name |
| 1 | 户口 |
| 2 | 查询机构数过多 |
| 3 | 危险驾驶 |
| 4 | 多头用信 |

需要输出name里的所有组合情况,即单个值,两两组合,三个组合、四个组合。结果为2的n次方-1中情况,这里是15。

预期结果为:

|----------------------|
| Combination |
| 危险驾驶 |
| 多头用信 |
| 户口 |
| 查询机构数过多 |
| 危险驾驶,多头用信 |
| 户口,危险驾驶 |
| 户口,多头用信 |
| 户口,查询机构数过多 |
| 查询机构数过多,危险驾驶 |
| 查询机构数过多,多头用信 |
| 户口,危险驾驶,多头用信 |
| 户口,查询机构数过多,危险驾驶 |
| 户口,查询机构数过多,多头用信 |
| 查询机构数过多,危险驾驶,多头用信 |
| 户口,查询机构数过多,危险驾驶,多头用信 |

解决方法

sql 复制代码
WITH RECURSIVE Recur(N,Combination) AS (
SELECT N, name
FROM (
SELECT id N,name FROM rejectdetail
) num
UNION ALL
SELECT n.N,CONCAT(r.Combination , ',',name)
FROM Recur r
INNER JOIN (
SELECT id N,name FROM rejectdetail
) n ON n.N > r.N)
SELECT Combination -- ,CONCAT("'",REPLACE(Combination,',',"','"),"'")  Combination_New
FROM Recur
ORDER BY LENGTH(Combination)-LENGTH(REPLACE(Combination,',','')),Combination;
相关推荐
笃行3506 小时前
金仓数据库数据安全双防线:静态存储加密与传输加密实战
数据库
笃行3506 小时前
金仓数据库物理备份实战:sys_rman 全流程演练与误覆盖抢救
数据库
笃行3506 小时前
金仓数据库逻辑备份实战:从全库导出到 Schema 替换的完整闭环
数据库
元Y亨H6 小时前
技术笔记:MySQL 字符集排序规则与大小写敏感性问题解决方案
mysql
SelectDB1 天前
阶跃星辰基于 SelectDB 构建 PB 级 Agent 可观测平台
大数据·数据库·aigc
这个DBA有点耶1 天前
GROUP BY优化全解:如何写出既不丢数据又飞快的分组查询
数据库·mysql·架构
掉头发的王富贵1 天前
【StarRocks】极限十分钟入门StarRocks
数据库·sql·mysql
Nturmoils1 天前
WHERE 条件别凭习惯写,常用查询先跑一遍
数据库
SamDeepThinking2 天前
一条UPDATE语句在MySQL 8.0中到底加了几把锁?
后端·mysql·程序员