比较不同的行并得出结果

Compare different rows and bring out result

我有一个 table,它要求我使用两行共享的唯一值将某些行配对在一起。

例如下面的table;

+--------+----------+-----------+-----------+----------------+-------------+
| id     | type     |  member   |  code     | description    | matching    |
+--------+----------+-----------+-----------+----------------+-------------+
| 1000   |transfer  |  552123   | SC120314  |  From Gold     |             |
| 1001   |transfer  |  552123   | SC120314  |  To Platinum   |             |
| 1002   |transfer  |  833612   | SC120314  |  From silver   |             |
| 1003   |transfer  |  833612   | SC120314  |  To basic      |             |
| 1004   |transfer  |  457114   | SC150314  |  From Platinum |             |
| 1005   |transfer  |  457114   | SC150314  |  To silver     |             |
| 1006   |transfer  |  933276   | SC180314  |  From Gold     |             |
| 1007   |transfer  |  933276   | SC180314  |  From To basic |             |
+--------+----------+-----------+-----------+----------------+-------------+

基本上我需要查询/例程做的是找到每行匹配的 'member' 列中的值的行。然后查看找到的相同行的 'code' 列中的值是否也匹配。

如果两行的两列都匹配,则为两行的 'matching' 列分配一个值。此值对于两行应该相同并且仅对它们是唯一的。

唯一代码绝对可以是任何东西,只要它是匹配行独有的。是否有任何查询/例程能够执行此操作?

我可以给你一个简单的查询什么可以做你需要的。

tst 是 table 的名称。

SELECT *, COUNT( t2.id ) as matching FROM tst t LEFT JOIN tst t2 ON t2.member = t.member GROUP BY t.id

我不确定我是否正确理解了这个问题,但是如果您想挑选并更新 codemember 列匹配的行并将 matching 设置为一些每个相关行的唯一值,我相信这会起作用:

UPDATE <table> A 
  INNER JOIN (SELECT * FROM <table>) B ON 
    B.member = A.member && B.code = A.code && A.id <> B.id
SET A.matching = (A.id + B.id);

匹配值将设置为两行 id 列的总和。 注意,如果可以匹配的行超过两行,则以这种方式更新 matching 字段将不起作用。

运行 以上针对您的示例的查询 table 将产生:

+------+----------+--------+----------+---------------+----------+
| id   | type     | member | code     | description   | matching |
+------+----------+--------+----------+---------------+----------+
| 1000 | transfer | 552123 | SC120314 | From Gold     | 2001     |
| 1001 | transfer | 552123 | SC120314 | To Platinum   | 2001     |
| 1002 | transfer | 833612 | SC120314 | From Silver   | 2005     |
| 1003 | transfer | 833612 | SC120314 | To basic      | 2005     |
| 1004 | transfer | 457114 | SC150314 | From Platinum | 2009     |
| 1005 | transfer | 457114 | SC150314 | To silver     | 2009     |
| 1006 | transfer | 933276 | SC180314 | From Gold     | 2013     |
| 1007 | transfer | 933276 | SC180314 | From To basic | 2013     |
+------+----------+--------+----------+---------------+----------+