在单个表中匹配多个记录

时间:2015-02-05 13:41:22

标签: mysql sql

我们有一个庞大的交易表,需要尝试匹配同一个人可能已进行交易的行。挑战在于没有将它们链接在一起的唯一键。

每行中有一系列项目,如果进行比较,我们可以将它们组合在一起。

例如,表格看起来像这样:

     =====================
     | C1 | C2 | C3 | C4 |
     ---------------------
  1  | A  | B  | C  | D  |
     ---------------------
  2  | B  | C  | D  | A  |
     ---------------------
  3  | A  | B  | C  | D  |
     ---------------------
  4  | C  | D  | A  | B  |
     ---------------------
  5  | A  | B  | C  | D  |
     =====================

因此,我们希望能够对可能'的交易进行分组。基于匹配的几个不同列与其他数据由同一个人制作。这些其他列都不会完全独特,因此我们需要在尽可能多的列上匹配记录,以增加它们与同一个人相关联的可能性。

组可能是错误的术语,因为我们想要一个结果,如:

     =====================
     | C1 | C2 | C3 | C4 |
     ---------------------
  1  | A  | B  | C  | D  |
     ---------------------
  2  | A  | B  | C  | D  |
     ---------------------
  3  | A  | B  | C  | D  |
     ---------------------
  4  | B  | C  | D  | A  |
     ---------------------
  5  | C  | D  | A  | B  |
     =====================

因此,在这种情况下,它已将行1,2和5显示在一起,因为它们在我们匹配的列中共享相同的信息。

我们尝试过类似的事情:

SELECT *
FROM group_test gt1, group_test gt2  
WHERE gt1.a = gt2.a
AND gt1.b = gt2.b
AND gt1.id != gt2.id;

但我们最终会遇到重复的行。也许这甚至不可能只使用SQL - 完全无知,所以任何帮助都将非常感谢!

1 个答案:

答案 0 :(得分:0)

也许只是一个简单的...

Select C1, C2, C3, C4 
from group_test
order by C1, C2, C3, C4

或者可能是一个分组依据并计数告诉你在同一数据上有多少行匹配...

Select count(*), C1, C2, C3, C4 
from group_test
GROUP BY by C1, C2, C3, C4

或者您可能只需要完成联接以删除重复项...

SELECT *
FROM group_test gt1
INNER JOIN group_test gt2  
  on gt1.a = gt2.a
 AND gt1.b = gt2.b
 AND gt1.c = gt2.c
 AND gt1.d = gt2.d
WHERE gt1.id != gt2.id;