比较不同的行并得出结果
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
我不确定我是否正确理解了这个问题,但是如果您想挑选并更新 code
和 member
列匹配的行并将 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 |
+------+----------+--------+----------+---------------+----------+
我有一个 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
我不确定我是否正确理解了这个问题,但是如果您想挑选并更新 code
和 member
列匹配的行并将 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 |
+------+----------+--------+----------+---------------+----------+