一尘不染

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

mysql

我有一个一般性的问题,我将尝试通过一个例子来解释。

假设我有一个包含以下字段的表格:“ 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    
)

但是MySQL在更新列中不接受别名T,而且我也没有找到其他方法来实现这一点。

有任何想法吗?


阅读 283

收藏
2020-05-17

共1个答案

一尘不染

遵循我收到的两个答案(所有答案都没有完成,所以我写了自己的答案),最终我做了以下工作:

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

它运作非常迅速。我也尝试了相关子查询,但是它慢得多(数量级),所以我坚持使用联接。

2020-05-17