使用distinctedjoin更新MySQL

使用distinctedjoin更新MySQL,mysql,join,sql-update,Mysql,Join,Sql Update,我有两张桌子: CREATE TABLE `tmp1` ( `c1` VARCHAR(50) NULL DEFAULT NULL, `c2` VARCHAR(50) NULL DEFAULT NULL ); CREATE TABLE `tmp2` ( `c1` VARCHAR(50) NULL DEFAULT NULL, `c2` VARCHAR(50) NULL DEFAULT NULL ); c2是主键。 对于tmp1,我有如下值: || 1 || val

我有两张桌子:

CREATE TABLE `tmp1` (
    `c1` VARCHAR(50) NULL DEFAULT NULL,
    `c2` VARCHAR(50) NULL DEFAULT NULL
);

CREATE TABLE `tmp2` (
    `c1` VARCHAR(50) NULL DEFAULT NULL,
    `c2` VARCHAR(50) NULL DEFAULT NULL
);
c2是主键。 对于tmp1,我有如下值:

|| 1 || val1 ||
|| 2 || val2 ||
|| 2 || val3 ||
对于tmp2:

|| 1 || val11 ||
|| 2 || val22 ||
|| 2 || val33 ||
|| 2 || val44 ||
我需要通过加入c1字段来更新tmp2,以接收如下结果:

|| 1 || val1 ||
|| 2 || val2 ||
|| 2 || val3 ||
|| 2 || val44 ||
|| 1 || val1 ||  ->(by c1)  || 1 || val11 ||
|| 2 || val2 ||  ->(by c1)  || 2 || val22 ||
|| 2 || val3 ||  ->(by c1)  || 2 || val33 ||
当我使用常规内部联接时,我将收到错误的结果:

|| 1 || val1 ||
|| 2 || val2 ||
|| 2 || *val2* ||
|| 2 || *val2* ||
我需要加入更新,如下所示:

|| 1 || val1 ||
|| 2 || val2 ||
|| 2 || val3 ||
|| 2 || val44 ||
|| 1 || val1 ||  ->(by c1)  || 1 || val11 ||
|| 2 || val2 ||  ->(by c1)  || 2 || val22 ||
|| 2 || val3 ||  ->(by c1)  || 2 || val33 ||
或者像这样,我想可能更真实

|| 1 || val1 ||  ->(by c1)  || 1 || val11 ||
|| 2 || val2 ||  ->(by c1)  || 2 || val22 ||
所以在第二种情况下,我认为我需要将tmp2按c1分组,将tmp1按c1分组,然后只更新该组中的一行

此选择返回我需要更新的内容:

select tmp1.c2, tmp2.c2 from tmp1
inner join tmp2 on tmp1.c1 = tmp2.c1 
group by tmp2.c1

|| val1 || val11 ||
|| val2 || val22 ||

我解决了此查询的问题:

UPDATE tmp2 as up
JOIN (select ij.c2 as x, src.c2 as y from tmp1 as src
inner join tmp2 as ij on src.c1 = ij.c1 
group by src.c1) as sel ON up.c2 = sel.x
SET up.c2 = y

当tmp2中的第一列相同时,它如何知道应该从tmp1复制哪一行?你需要一些区分行的方法。不清楚你想要什么。根据SQL标准,MySQL正在返回正确的结果,但是如果没有精确的查询,很难说更新一定是这样的。但这是错误的sql:更新tmp2为up set up.c2=从tmp1中选择tmp1.c2作为j在tmp1.c1=j.c1中,up.c1=tmp1.c1按j.c1分组这也是错误的查询=更新tmp2为up join从tmp1中选择ij.c2作为x,src.c2作为y在src.c1=ij.c1组中选择src.c1作为ij在up.c2=x set up.c2=y