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
谢谢!!
| 归档时间: |
|
| 查看次数: |
431 次 |
| 最近记录: |