我正在寻找任何想法,如何计算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
非常感谢你! 托米
答案 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;