使用SQL生成组合:针对MySQL样本数据库的技术问询
生成数据组合的SQL实现方案
先把你提供的样本数据再列出来方便参考:
| ID | Title | Value |
|---|---|---|
| 1 | A1 | 1 |
| 2 | A2 | 10 |
| 3 | A3 | 3 |
| 4 | B1 | 5 |
| 5 | B2 | 7 |
| 6 | C1 | 8 |
| 7 | C2 | 23 |
| 8 | D1 | 3 |
| 9 | Z1 | 0 |
| 10 | Z... | ... |
下面根据不同的组合需求给出对应的SQL代码:
1. 同一字母组内的两两不重复组合
如果需要生成每个字母前缀分组(比如A组、B组)内的所有两两组合,且避免重复(比如只保留A₁&A₂,不出现A₂&A₁),可以用自连接实现:
SELECT t1.Title AS 组合项1, t1.Value AS 数值1, t2.Title AS 组合项2, t2.Value AS 数值2 FROM 你的表名 t1 INNER JOIN 你的表名 t2 ON LEFT(t1.Title, 1) = LEFT(t2.Title, 1) -- 匹配同一字母前缀 AND t1.ID < t2.ID; -- 保证组合不重复
2. 跨所有组的全量两两组合
要是需要所有记录之间的两两组合(包括同组和跨组,同样避免重复),可以去掉前缀匹配的条件:
SELECT t1.Title AS 组合项1, t1.Value AS 数值1, t2.Title AS 组合项2, t2.Value AS 数值2 FROM 你的表名 t1 INNER JOIN 你的表名 t2 ON t1.ID < t2.ID; -- 仅通过ID避免重复组合
3. 不同字母组之间的组合(每组取任意成员)
如果需要实现不同字母组之间的交叉组合(比如A组的任意成员和B组的任意成员配对),可以先通过CTE提取分组信息,再做交叉连接:
WITH 分组成员 AS ( SELECT LEFT(Title, 1) AS 组前缀, Title, Value FROM 你的表名 ) SELECT gm1.Title AS 甲组项, gm1.Value AS 甲组值, gm2.Title AS 乙组项, gm2.Value AS 乙组值 FROM 分组成员 gm1 CROSS JOIN 分组成员 gm2 WHERE gm1.组前缀 != gm2.组前缀; -- 只保留不同组的组合
注意事项
- 记得把代码里的
你的表名替换成你实际使用的表名称。 - 如果你的
Title前缀规则不是第一个字符(比如格式是A_1这种),可以用REGEXP_SUBSTR(Title, '^[A-Za-z]+')来提取字母前缀(MySQL 8.0及以上版本支持正则函数)。
内容的提问来源于stack exchange,提问作者hsnsd
相关产品推荐
相关产品推荐

