我有一个 numbers
表,它由 [0-9]
范围内的各种 nums
组成
--------
| nums |
--------
| 0 |
| 1 |
| .... |
| 9 |
--------
我想多次取这个表的笛卡尔积(其实准确来说是8次):
SELECT * FROM numbers A, numbers B, numbers C, numbers D, ...
A.nums
和 B.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/