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

qxl*_*lab 5 mysql sql join sql-update

概念上的疑问:

我已经尝试了很多事情(MySQL),但是此更新起作用的唯一方法是我在此处描述的方法。它正在工作,但是我要确保这一点:

当我们在更新中使用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);
Run Code Online (Sandbox Code Playgroud)

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

谢谢!!

Bar*_*mar 2

文档

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

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

  • 这是我通常提到的获取组最后一行的问题:http://stackoverflow.com/questions/1313120/retriving-the-last-record-in-each-group (2认同)