mysql - 查找唯一的元组和列排列

标签 mysql sql permutation

我有一个 numbers 表,它由 [0-9] 范围内的各种 nums 组成

 --------
 | nums |
 --------
 |  0   |
 |  1   |
 | .... |
 |  9   |
 --------

我想多次取这个表的笛卡尔积(其实准确来说是8次):

SELECT * FROM numbers A, numbers B, numbers C, numbers D, ...

A.numsB.nums, ... 是唯一的组合,并且它们不等于另一个数字的相同值。

这是我希望看到的一些示例输出:

(0, 1, 2, 3)
(3, 2, 1, 0)
(2, 1, 3, 0)
(0, 2, 1, 3)
(0, 9, 8, 7)
(1, 2, 3, 4)
(1, 3, 5, 9)
(1, 9, 8, 7) 

... 但没有像 (0, 0, 1, 2), (1, 1, 2, 2) 等这样的元组。 元组也不应该重复,例如 (1, 2, 3, 4) 和 (1, 2, 3, 4) 元组中的每个值都必须与元组中的另一个值不同

我确信有一种更有效的方法可以做到这一点,但我对每一种可能性都求助于 A.nums != B.nums, ...。看起来比较有效率;为 8 向笛卡尔积提供约 300 毫秒的运行时间,但我想知道是否有更简单、更优雅的具有类似运行时间的解决方案。

最佳答案

CREATE TABLE nums (x INT);

INSERT INTO nums (x) VALUES (0), (1), (2), (3), (4); 

SELECT a.x, b.x, c.x, d.x 
FROM nums AS a 
JOIN nums AS b ON b.x NOT IN (a.x) 
JOIN nums AS c ON c.x NOT IN (a.x, b.x) 
JOIN nums AS d ON d.x NOT IN (a.x, b.x, c.x);

关于mysql - 查找唯一的元组和列排列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15060307/

相关文章:

mysql - DELETE CASCADE MySQL 最佳实践

php - 提高先选择然后插入的性能以避免重复记录(在mysql和php中)?

php - 快速远程 mysql 连接的最佳方法/设置是什么?

mysql - WordPress MySQL : add new term relationships if term_taxonomy_id == 4

javascript - 生成完全包含原始集合中元素的子集的所有组合

html - 如何通过查询去除重复项?

Java - 如何通过仅打印具有相同名称的行来从数据库中打印数据

sql - PostgreSQL 在外键中使用常量

algorithm - 高效的出租车调度

python - 遍历适合特定键的排列