0

我有一个从单个表输出组合的查询

Select  t1.id as id1, t2.id as id2, t3.id as id3
    mytable t1, 
    mytable t2,
    mytable t3
WHERE condition = true

其中,当表包含 5 个条目时,返回如下内容

row  id1, id2, id3

1.     1,  2,  3
2.     1,  2,  4
3.     1,  2,  5
4.     1,  3,  4
5.     1,  3,  5
6.     1,  3,  2
7.     2,  1,  3   
8.     2,  1,  4
9.     2,  1,  3
       etc....

我想过滤掉 3 的唯一组合,所以在上面的例子中,第 1,6 和 7 行是同一个集合(它们都包含 1、2 和 3),所以只保留其中一个。

有没有办法生成代表该集合的唯一值的另一列?

例如,是否可以对 id1、id2 和 id3 进行排序并生成一个唯一的字符串?(我知道排序在列上效果很好,但是在 MySQL 中的行上是否可行)。类似于 GROUP_CONCAT,但对元素进行了排序。

还是有另一种方法来消除重复集?

4

3 回答 3

1

我尝试了以下方法:

SELECT t1.id as id1,
   t2.id as id2,
   t3.id as id3
FROM t1, t2, t3
GROUP BY MD5(t1.id+" "+t2.id+" "+t3.id)

而且我认为结果可能是您所需要的,因为
md5(t1.id+" "+t2.id+" "+t3.id)= md5(t3.id+" "+t2.id+" "+t1.id)
=md5(t2.id+" "+t1.id+" "+t3.id)等等。

编辑:我还添加了一个不等式以避免相同的 id 记录,
WHERE t1.id <> t2.id AND t2.id <> t3.id AND t1.id <> t3.id.

请参阅SQLFiddle

于 2013-10-04T08:12:54.697 回答
1

这是矫枉过正,但你可以得到线索:

SELECT DISTINCT
  @t1:=LEAST(t1.id,t2.id,t3.id) AS id1,
  @t2:=GREATEST(t1.id,t2.id,t3.id) AS id2,
  t1.id+t2.id+t3.id-@t1-@t2 AS id3
  FROM table1 t1, table2 t2, table3 t3
于 2013-10-04T08:25:03.907 回答
0

好的,受其他答案的启发,我意识到最简单的方法是添加一个条件

SELECT t1.id as id1,
   t2.id as id2,
   t3.id as id3
FROM 
    mytable t1
    mytable t2
    mytable t3
WHERE    
    id1 > id2 AND id2 > id3

它应该很快,因为在过滤之前没有额外的计算,并且只允许集合的组合之一通过。

实际上,我们正在过滤以仅允许已排序的集合通过。

于 2013-10-04T08:41:20.270 回答