MySQL/SQL:使用更新表本身的相关子查询进行更新

Roe*_*ler 20 mysql sql correlated-subquery sql-update

我有一个通用的问题,我将尝试使用一个例子来解释.

假设我有一个包含字段的表:"id","name","category","appearances"和"ratio"

我的想法是,我有几个项目,每个项目都与一个类别有关并且多次"出现".比率字段应包括每个项目出现的百分比,超出该类别中项目的总出现次数.

在伪代码中我需要的是以下内容:

  • 对于每个类别,
    查找与其相关的项目的外观总和.例如,它可以用(select sum("appearances") from table group by category)完成

  • 对于每个项目,
    将比率值设置为项目的外观除以上面类别的总和

现在,我正在尝试使用单个更新查询来实现此目的,但似乎无法做到这一点.我认为我应该做的是:

update Table T    
set T.ratio = T.appearances /   
(    
select sum(S.appearances)    
from Table S    
where S.id = T.id    
)
Run Code Online (Sandbox Code Playgroud)

但MySQL不接受更新列中的别名T,我没有找到实现此目的的其他方法.

有任何想法吗?

Roe*_*ler 48

根据我收到的两个答案(其中没有一个是完整的,所以我自己编写),我最终做的如下:

UPDATE Table AS target
INNER JOIN 
(
select category, appearances_sum
from Table T inner join (
    select category as cat, sum(appearances) as appearances_sum
    from Table
    group by cat
) as agg
where T.category  = agg.cat
group by category
) as source
ON target.category = source.category
SET target.probability = target.appearances / source.appearances_sum 
Run Code Online (Sandbox Code Playgroud)

它运作得非常快.我也尝试过相关的子查询,但速度要慢得多(数量级),所以我坚持使用连接.


Fra*_*uma 6

在UPDATE之后立即使用连接: 参考手册 - 13.2.11 UPDATE语法

所以UPDATE table1内部连接table2 on .... set table1.foo = value where table2.bla = someothervalue

有了这些东西,请务必查看手册.MySql有一个正确的参考手册,所以它不应该很难获得正确的语法;)