我有一个查询,可以从单个表中输出组合
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的东西,但元素已经排序。
还是有另一种消除重复集的方法吗?
答案 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
它应该很快,因为在过滤之前没有额外的计算,并且只允许其中一个组合通过。
实际上,我们过滤只允许排序的集合。