MySQL从具有一定长度的数字生成所有可能的组合

时间:2017-09-08 11:36:46

标签: mysql combinations permutation

如何从具有一定长度的MySql表中的数字生成所有可能的组合?例如8个数字。

只有MySql不与php一起使用。

我的表格“数字”包含:

0
1
2
3
4
5
6
7
8
9

我现在想要在“numbers1”中创建所有可能的组合。

像:

00000001
00000002
00000003
00000004

2 个答案:

答案 0 :(得分:0)

如果长度是固定的,那很简单,所以你可以做这样的事情

DECLARE @number TABLE (num NVARCHAR(1))
INSERT INTO @number
VALUES ('0'),('1'),('2'),('3'),('4'),('5'),('6'),('7'),('8'),('9')

SELECT n1.num + n2.num + n3.num + n4.num
FROM @number n1, @number n2, @number n3, @number n4

如果数字是可变的,你可以构建sql-command并使用sp_execute @cmd执行它,或者你可以为它创建一个table-value-function。

编辑:我刚刚过度了#34; mysql" -part。上面的解决方案是用TSQL编写的(使用MS SqlServer)。我不完全确定,但你唯一要改变的应该是变量的声明。

CREATE TEMPORARY TABLE @number (num NVARCHAR(1))

如果我没有错,而不是使用sp_execute来执行命令,你可以使用像

这样的东西
PREPARE cmd FROM 'SELECT ...'
EXECUTE cmd

答案 1 :(得分:0)

听起来你想要一个笛卡尔产品,但我不明白为什么你想要在输出中只有一个列,但无论如何

select distinct case when u1.id >= u.id then u.id else u1.id end umin,
         case when u1.id < u.id then u.id else u1.id end umax
from users u cross join users u1
where u1.id <> u.id
order by umin,umax

交叉连接创建笛卡尔积,where子句删除组合/ permuatation导致相同值的那些,例如1,1 2,2等和不同的重复数据删除 所以给定了这个

MariaDB [sandbox]> select id  from users;
+----+
| id |
+----+
|  1 |
|  2 |
|  3 |
|  6 |
|  7 |
|  8 |
| 10 |
| 12 |
| 14 |
| 15 |
| 16 |
| 17 |
| 18 |
| 19 |
| 20 |
+----+
15 rows in set (0.00 sec)

查询结果

+------+------+
| umin | umax |
+------+------+
|    1 |    2 |
|    1 |    3 |
|    1 |    6 |
|    1 |    7 |
|    1 |    8 |
|    1 |   10 |
|    1 |   12 |
|    1 |   14 |
|    1 |   15 |
|    1 |   16 |
|    1 |   17 |
|    1 |   18 |
|    1 |   19 |
|    1 |   20 |
|    2 |    3 |
|    2 |    6 |
|    2 |    7 |
|    2 |    8 |
|    2 |   10 |
|    2 |   12 |
|    2 |   14 |
|    2 |   15 |
|    2 |   16 |
|    2 |   17 |
|    2 |   18 |
|    2 |   19 |
|    2 |   20 |
|    3 |    6 |
|    3 |    7 |
|    3 |    8 |
|    3 |   10 |
|    3 |   12 |
|    3 |   14 |
|    3 |   15 |
|    3 |   16 |
|    3 |   17 |
|    3 |   18 |
|    3 |   19 |
|    3 |   20 |
|    6 |    7 |
|    6 |    8 |
|    6 |   10 |
|    6 |   12 |
|    6 |   14 |
|    6 |   15 |
|    6 |   16 |
|    6 |   17 |
|    6 |   18 |
|    6 |   19 |
|    6 |   20 |
|    7 |    8 |
|    7 |   10 |
|    7 |   12 |
|    7 |   14 |
|    7 |   15 |
|    7 |   16 |
|    7 |   17 |
|    7 |   18 |
|    7 |   19 |
|    7 |   20 |
|    8 |   10 |
|    8 |   12 |
|    8 |   14 |
|    8 |   15 |
|    8 |   16 |
|    8 |   17 |
|    8 |   18 |
|    8 |   19 |
|    8 |   20 |
|   10 |   12 |
|   10 |   14 |
|   10 |   15 |
|   10 |   16 |
|   10 |   17 |
|   10 |   18 |
|   10 |   19 |
|   10 |   20 |
|   12 |   14 |
|   12 |   15 |
|   12 |   16 |
|   12 |   17 |
|   12 |   18 |
|   12 |   19 |
|   12 |   20 |
|   14 |   15 |
|   14 |   16 |
|   14 |   17 |
|   14 |   18 |
|   14 |   19 |
|   14 |   20 |
|   15 |   16 |
|   15 |   17 |
|   15 |   18 |
|   15 |   19 |
|   15 |   20 |
|   16 |   17 |
|   16 |   18 |
|   16 |   19 |
|   16 |   20 |
|   17 |   18 |
|   17 |   19 |
|   17 |   20 |
|   18 |   19 |
|   18 |   20 |
|   19 |   20 |
+------+------+
105 rows in set (0.00 sec)