【问题标题】:MySQL generate all possible combinations from numbers with a certain lengthMySQL从具有一定长度的数字生成所有可能的组合
【发布时间】:2017-09-08 11:36:45
【问题描述】:

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

仅与 MySql 不与 php 一起使用。

我的表格“数字”包含:

0
1
2
3
4
5
6
7
8
9

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

喜欢:

00000001
00000002
00000003
00000004

【问题讨论】:

  • 为什么不使用循环呢?
  • 我搜索最好最快的方法 ;-) 如何用循环做到最好?
  • 我想最快的方法是设置一个标识种子列并在 while 循环中根据需要插入尽可能多的行。这样做的缺点是缺少左侧填充零,但您可以使用合适的 select 语句来获取它们。
  • 单列如何排列 - 期望像 0,1 0,2 0,3 等
  • 是的,我想是的——尽管在这种情况下,OP 是 (我认为),只是在从 1 到 99999999 的所有数字之后——所有的零都证明了这一点。

标签: mysql combinations permutation


【解决方案1】:

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

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 子句删除了组合/排列产生相同值的那些,例如 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)

【讨论】:

    【解决方案2】:

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

    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 命令并使用sp_execute @cmd 执行它,或者您可以为其创建一个表值函数。

    编辑:我只是重读了“mysql”部分。上面的解决方案是用 TSQL 编码的(使用 MS SqlServer)。我不完全确定,但您唯一需要更改的应该是变量的声明。

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

    如果我没记错的话,你可以使用类似的东西而不是使用 sp_execute 来执行命令

    PREPARE cmd FROM 'SELECT ...'
    EXECUTE cmd
    

    【讨论】:

    • 这个解决方案中有很多东西不适合mysql
    • 是的,我也这么认为。
    • 添加了一些关于具体 mysql 实现的更多信息
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-02-07
    • 1970-01-01
    • 2021-12-14
    • 1970-01-01
    • 2012-02-28
    • 2013-01-04
    • 2022-11-02
    相关资源
    最近更新 更多