我有一个一般性问题,我将尝试用一个例子来解释。
假设我有一个包含以下字段的表:“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/