MySQL/SQL:更新与相关查询,从更新的表本身
-
22-07-2019 - |
题
我有一个一般性的问题,我将尽力说明使用的一个例子。
说我有一个表格与该领域:"id","name","类别"、"外表"和"比"
这个想法是,我有几个项目,每个项目相关的一个单一的类别以及"出现"数次。该比率领域应当包括的百分比每个项目的表总数的表中的项目类别。
在伪码我需要的是如下:
每个类别
找到总额的出现为有关的项目。例如,它可以与(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
它的工作非常迅速。我还试图与相关查询,但它慢得多(数量),因此我坚持的加入。
其他提示
使用加权后的更新:参考手册》–13.2.11更新的语法
所以 更新table1内加入表2。设置table1。foo=值 在表2.唠唠叨叨=someothervalue
与这类事情,总是看看的手册。MySql有一个适当的参考手册,使它不应该是很难得到正确的语法;)
这是怎么做到在数据库,我认为mysql是相同或相似的:
create table T (id int, ratio float, appearances int)
insert T values (1, null, 2)
insert T values (1, null, 3)
update T
set ratio = cast(appearances as float)/ agg.appearancesSum
from T join (
select id, sum(appearances) as appearancesSum
from T
group by id
) as agg on t.id = agg.id
不隶属于 StackOverflow