-1

我正在寻找任何想法,如何计算mysql中两个不同表的每行之间的匹配字段数。

假设表A是。

| ABC1    | ABC2    | ABC3    | ABC4    | ABC5    | LINE_A   |
| a       | b       | c       | d       | e       | A1       |
| f       | g       | h       | i       | j       | A2       |
| k       | l       | m       | n       | o       | A3       |
| p       | q       | r       | s       | t       | A4       |
| x       | y       | z       | u       | v       | A5       |

表 B 是:

| BBC1    | BBC2    | BBC3    | BBC4    | BBC5    | LINE_B  |
| a       | d       | f       | k       | o       | B1      |
| f       | k       | l       | p       | q       | B2      |

结果应该是:

B1.A1: 2 ('a' and 'd')
B2.A1: 0
B1.A2: 1 ('f')
B2.A2: 1 ('f')
B1.A3: 3 ('k' and 'o')
.
.
.
B2.A5: 0

十分感谢!富美

4

1 回答 1

0

你可以这样做:

select A.Line_A, B.Line_B,
       ((ABC1 = BBC1) +
        (ABC2 = BBC2) +
        (ABC3 = BBC3) +
        (ABC4 = BBC4) +
        (ABC5 = BBC5)
       ) as NumMatching        
from A cross join
     B;

生成所有行对cross join。在 MySQL 中,布尔结果被视为整数,0 为假,1 为真。所以布尔值的总和计算了匹配字段的数量。

编辑:

我注意到所需的结果不是对字段进行配对。这使它有点复杂。如果没有重复的值或 NULL(如您的示例数据中所示),则此方法有效:

select A.Line_A, B.Line_B,
       ((ABC1 in (BBC1, BBC2, BBC3, BBC4, BBC5)) +
        (ABC2 in (BBC1, BBC2, BBC3, BBC4, BBC5)) +
        (ABC3 in (BBC1, BBC2, BBC3, BBC4, BBC5)) +
        (ABC4 in (BBC1, BBC2, BBC3, BBC4, BBC5)) +
        (ABC5 in (BBC1, BBC2, BBC3, BBC4, BBC5))
       ) as NumMatching        
from A cross join
     B;
于 2013-11-04T22:25:30.053 回答