MySQL,过滤重复集

时间:2013-10-04 07:43:36

标签: mysql filter set

我有一个查询,可以从单个表中输出组合

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的东西,但元素已经排序。

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

3 个答案:

答案 0 :(得分: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

答案 1 :(得分: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

答案 2 :(得分: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

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

实际上,我们过滤只允许排序的集合。