【问题标题】:Comparing pairs where sequence does not matter比较顺序无关紧要的对
【发布时间】:2017-04-13 14:01:43
【问题描述】:

我想压缩表中的数据,以便在对序列方面没有冗余,例如 a,b 与 b,a as pair 相同。

特别是我想从表中获取: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],我已经有一个存在这些关系的表,我想删除后面的。

【问题讨论】:

    标签: mysql sql relationship


    【解决方案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
                     );
    

    【讨论】:

      猜你喜欢
      • 2018-05-19
      • 2011-05-09
      • 1970-01-01
      • 2014-03-21
      • 2020-09-10
      • 1970-01-01
      • 1970-01-01
      • 2011-12-11
      • 2023-03-15
      相关资源
      最近更新 更多