具有多种连接可能性的连接的 MySQL 更新

Posted

技术标签:

【中文标题】具有多种连接可能性的连接的 MySQL 更新【英文标题】:MySQL update with join with multiple join possibilities 【发布时间】:2014-09-22 21:16:51 【问题描述】:

概念怀疑:

我已经尝试了很多东西(mysql),但这个更新的唯一工作方式就是我在这里描述的方式。它正在工作,但我想确认一下:

当我们在更新中使用join时,我将设置的值来自正在加入的表,并且有多个join对于每一行的可能性,更新是否总是第一个可能的行来进行连接?

create table letter (id_letter bigint, id_group_table bigint, letter char(1));  
create table group_table (id_group_table bigint, id_whatever bigint, champion char(1));
create table whatever (id_whatever bigint);

insert into whatever values (1);
insert into whatever values (2);
insert into whatever values (3);
insert into whatever values (4);
insert into whatever values (5);

insert into group_table values(1, 1, null); -- champion should be B
insert into group_table values(2, 2, null); -- champion should be C
insert into group_table values(3, 3, null); -- champion should be X
insert into group_table values(4, 4, null); -- champion should be C
insert into group_table values(5, 5, null);

insert into letter values(1,1,'A');
insert into letter values(2,1,'B');
insert into letter values(3,1,'B');

insert into letter values(4,2,'B');
insert into letter values(5,2,'C');
insert into letter values(6,2,'C');

insert into letter values(7,3,'X');
insert into letter values(8,3,'X');
insert into letter values(9,3,'Y');

insert into letter values(10,4,'A');
insert into letter values(11,4,'A');
insert into letter values(12,4,'C');

insert into letter values(13,4,'C');
insert into letter values(14,4,'C');
insert into letter values(15,4,'C');

insert into letter values(16,5,'B');
insert into letter values(17,5,'C');
insert into letter values(18,5,'C');

-- update to set champions for everybody

update group_table 
join
  (select  letter,
  id_group_table, 
  count(letter) as occurences
  from letter
  group by id_group_table, letter 
  order by occurences desc
  ) tab on group_table.id_group_table = tab.id_group_table

set champion = tab.letter
where group_table.id_whatever in (1,2,3,4);

http://sqlfiddle.com/#!2/6ea061/1

谢谢!!

【问题讨论】:

【参考方案1】:

documentation 说:

每个匹配的行更新一次,即使它多次匹配条件。

但是,它并没有具体说明它是始终使用的第一个值,所以我不确定您是否可以可靠地依赖它。如果您编写子查询以便它只返回每个id_group_table 的冠军,那会更好。有许多 SO 问题展示了如何编写这样的查询。

【讨论】:

感谢您的回答,但这并不容易,至少对我来说。在 MySQL 中,您不能引用 update 表。如果这是可能的,我只需将子查询链接到 update 表,按字母分组,并将结果限制为 1。 您不需要引用更新表。您只需要重写子查询,使其每个id_group_table 只返回一行。查看标记为[mysql] [greatest-n-per-group]的所有问题。 如果你想检查它的更新顺序,创建一个类似于 group_table_chk 的表,并在更新后在 group_table 上创建一个触发器,在其中你向 chk 表添加一个插入命令。 嗯,谢谢,这个主题对我来说是新的!我会理解并接受你的回答! 这是我通常用来获取组的最后一行的问题:***.com/questions/1313120/…

以上是关于具有多种连接可能性的连接的 MySQL 更新的主要内容,如果未能解决你的问题,请参考以下文章

MySQL 连接错误集锦 - 长期更新

MySQL数据库的多种连接方式及工具

使用 %s 的 MySQL 连接器/python 困难

从 MySQL 连接到远程数据库 - 可能吗?

具有多个可能连接(或连接中的条件)的 SQL 查询

MySQL 更新连接表