2017-04-13 61 views
0

我想压缩表中的数据,使得在序列对中没有冗余,例如a,b与b,a相同。比较序列无关的对

具体来说,我想从表中可以得到:redundant_relations

+------+------+------+ 
| p1 | p2 | score| 
+------+------+------+ 
| a | b | 0.8 | 
| a | c | 0.67 | 
| b | a | 0.8 | 
| c | a | 0.67 | 
| a | d | 0.89 | 
| a | e | 0.47 | 
| d | a | 0.89 | 
| e | a | 0.47 | 
+------+------+------+ 

+------+------+------+ 
| p1 | p2 | score | 
+------+------+------+ 
| a | b | 0.8 | 
| a | c | 0.67 | 
| a | d | 0.89 | 
| a | e | 0.47 | 
+------+------+------+ 

在这里,我只是想只选择第一个关系,并丢弃反向关系作为例如,如果A和B是得分为0.8的朋友我想为他们的关系保留一行作为[A,B,0.8]而不是两行,即[A,B,0.8]和[B,A,0.8],我已经有一张桌子,这些关系存在,我想删除后者。

在此先感谢。

回答

1

如果你知道你都对,那么就这样做:

select rr.* 
from redundant_relations rr 
where rr.p1 < rr.p2; 

这变得更加复杂,如果关系并不是全部配对或者如果分数是不一样的。在这种情况下,我建议在(p1, p2, score)

select rr.* 
from redundant_relations rr 
where rr.p1 < rr.p2 
union all 
select rr.* 
from redundant_relations rr 
where rr.p1 > rr.p2 and 
     not exists (select 1 
        from redundant_relations rr2 
        where rr2.p1 = rr.p2 and rr2.p2 = rr.p1 and rr2.score = rr.score 
       ); 
+0

索引这是很酷的戈登!谢谢哥们 –