MySQL/SQL : Update with correlated subquery from the updated table itself

标签 mysql sql sql-update correlated-subquery

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

假设我有一个包含以下字段的表:“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,我也没有找到其他实现方式。

有什么想法吗?

最佳答案

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

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 

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

关于MySQL/SQL : Update with correlated subquery from the updated table itself,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/839938/

相关文章:

MySQL按列排序,值的平均分布

mysql - 查询右侧 4 列时结果为空

android - 更新时出现 SQLite 语法错误

mysql - 基于其他列sql更新列的表达式

phpMyAdmin 正在为 PMA_Tracking 等寻找错误的数据库

c++ - LNK2019 与 MySQL 连接器

MySQL - 每个类别选择一个条目

sql - 需要帮助优化 MySQL 查询

python - INSERT datetime variable INTO VALUES 的语法是什么

MySQL 根据其他两个表的值更新表列