Sil*_*ini 5 mysql self-join identifier cartesian-product
有两个表:表 A 和表 B。它们具有相同的列并且数据几乎相同。它们都有自动递增的 ID,两者之间的唯一区别是它们对相同的记录具有不同的 ID。
在这些列中,有一个 IDENTIFIER 列不是唯一的,即在两个表中都有(很少)具有相同 IDENTIFIER 的记录。
现在,为了找到表 A 的 ID 和表 B 的 ID 之间的对应关系,我必须在 IDENTIFIER 列上连接这两个表(出于所有目的,它是一个自连接),例如:
SELECT A.ID, B.ID
FROM A INNER JOIN B ON A.IDENTIFIER = B.IDENTIFIER
Run Code Online (Sandbox Code Playgroud)
但是,作为 IDENTIFIER 非唯一性,这会生成 IDENTIFIER 重复值的所有可能组合,我不希望那样。
理想情况下,我想根据它们的顺序在具有重复 IDENTIFIER 值的 ID 之间生成一对一的关联。例如,假设表 A(因此在表 B)中有 6 个具有不同 ID 和相同 IDENTIFIER 值的记录:
A B
IDENTIFIER:'ident105', ID:10 -> IDENTIFIER:'ident105', ID:3
IDENTIFIER:'ident105', ID:20 -> IDENTIFIER:'ident105', ID:400
IDENTIFIER:'ident105', ID:23 -> IDENTIFIER:'ident105', ID:420
IDENTIFIER:'ident105', ID:100 -> IDENTIFIER:'ident105', ID:512
IDENTIFIER:'ident105', ID:120 -> IDENTIFIER:'ident105', ID:513
IDENTIFIER:'ident105', ID:300 -> IDENTIFIER:'ident105', ID:798
Run Code Online (Sandbox Code Playgroud)
那将是理想的。无论如何,无论 ID 的顺序如何,生成一对一关联的方法仍然可以(但不是首选)。
谢谢你的时间,
西尔维奥
select a_numbered.id, a_numbered.identifier, b_numbered.id from
(
select a.*,
case
when @identifier = a.identifier then @rownum := @rownum + 1
else @rownum := 1
end as rn,
@identifier := a.identifier
from a
join (select @rownum := 0, @identifier := null) r
order by a.identifier
) a_numbered join (
select b.*,
case
when @identifier = b.identifier then @rownum := @rownum + 1
else @rownum := 1
end as rn,
@identifier := b.identifier
from b
join (select @rownum := 0, @identifier := null) r
order by b.identifier
) b_numbered
on a_numbered.rn=b_numbered.rn and a_numbered.identifier=b_numbered.identifier
Run Code Online (Sandbox Code Playgroud)