MySQL笛卡尔产品条件

时间:2010-10-09 21:36:55

标签: mysql

我需要一个mysql查询的帮助。 我有3张桌子

x1 x2 x3
1  1  1
2  2  2
2  2  2

我有2个连接

select distinct

x1.int1 as a,
x2.int1 as b,
x3.int1 as c

from 
x1
JOIN
x2
JOIN 
x3

但是我希望生成具有结果条件的笛卡尔积  应该只包含所有订单中x1 (1,2,2)的3个数字,我不知道在查询中放入什么条件

这是三个元素的排列模拟(1,2,2) 结果应该是 1,2,2 2,1,2 2,2,1

由于

3 个答案:

答案 0 :(得分:0)

你想要的吗?

SELECT DISTINCT * FROM x1 A,x1 B,x1 C

答案 1 :(得分:0)

考虑到排列总是由(1,2,2)组成,有很多方法可以得到你想要的结果。

最简单的方法是创建一个包含permutuations的表:

create table perm ( `int1` int, `int2` int, `int3` int );
insert into perm values (1,2,2), (2,1,2), (2,2,1);

另一种方法是接受现有的连接,并限制有效排列集的答案:

select distinct    
  x1.int1 as a,
  x2.int1 as b,
  x3.int1 as c
from x1
JOIN x2
JOIN x3
WHERE (a=1 and b=2 and c=2)
   OR (a=2 and b=1 and c=2)
   OR (a=2 and b=2 and c=1);

另一种方法是将连接表添加到连接中:

select distinct
  x1.int1 as a,
  x2.int1 as b,
  x3.int1 as c
from x1
JOIN x2
JOIN x3
JOIN perm p on p.`int1` = a and p.`int2` = b and p.`int3` = c

另一种方法是再次对表x1加入两次,确保x1中的每一行都出现在每个结果中:

select distinct
  c1.int1 as a,
  x2.int1 as b,
  x3.int1 as c
from x1 as c1
JOIN x2
JOIN x3
JOIN x1 as c2 on c2.`int1` = b and c2.`int1` != c1.`int1` and c2.`int1` != c3.`int1` 
JOIN x1 as c3 on c3.`int1` = c and c3.`int1` != c1.`int1` and c3.`int1` != c2.`int1`

...但是,如果值2出现在x1两次,这将无效。需要一些唯一的每行值来区分包含2的一行与另一行。

排列表最简单。

答案 2 :(得分:0)

第二次尝试 - 在澄清问题之后。

create table p ( bit int not null, v int not null );
insert into p values (1,1), (2,2), (4,2);

select distinct p1.v, p2.v, p3.v 
from p as p1 join p as p2 join p as p3 
where p1.bit + p2.bit + p3.bit = 7;

列'v'包含您想要置换的值,即。 1,2,2。

重要的一点是,必须为每一行赋予列'bit'一个唯一值,并且这组值必须使得只有在每行出现一次且只有一次时才能得到总和。

满足此要求的最简单的值是序列2 ^ 0,2 ^ 1 .. 2 ^ 31。 32位int限制为32行。对于包含3行的表,总和为1 + 2 + 4 = 7.

结果是:

+---+---+---+
| v | v | v |
+---+---+---+
| 2 | 2 | 1 |
| 2 | 1 | 2 |
| 1 | 2 | 2 |
+---+---+---+

如果添加了更多行,则必须将更多联接添加到查询中,并重新计算位列的总和。