我有一个一般性的问题,我将尽力说明使用的一个例子。

说我有一个表格与该领域:"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
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top