连续匹配的字段数

时间:2013-11-04 22:18:19

标签: mysql row match

我正在寻找任何想法,如何计算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

非常感谢你! 托米

1 个答案:

答案 0 :(得分: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表示false,1表示true。因此,布尔值的总和会计算匹配字段的数量。

编辑:

我注意到所需的结果不是对字段进行配对。这使它更复杂一些。如果没有重复值或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;