2016-07-29 47 views
0

我想要做这样的查询:如何更新连接和分组?

UPDATE State 
LEFT JOIN Actions ON Actions.id = State.id 
SET duration = FLOOR(AVG(duration)) WHERE type = 'started' GROUP BY Actions.id 

我将如何做到这一点? (它说,该组织将是一个错误)

回答

2
UPDATE State 
INNER JOIN 
(
    select id, FLOOR(AVG(duration)) as avg 
    from Actions 
    WHERE type = 'started' 
    group by id   
) tmp ON tmp.id = State.id 
SET duration = tmp.avg 
+0

这几乎是答案。你能否更新内部查询以使'WHERE type - 'started''和外部查询成为'WHERE State.id = tmp.id'?我会将这些更改标记为答案 –

+0

我改变了它。外部查询不需要'where'子句,因为当您使用'INNER JOIN'而不是'LEFT JOIN'时,JOIN已经过滤了'ON'子句中的数据。 –

+0

外部查询确实需要它。当我没有运行时,我得到一个错误,它试图设置一个空值。但是在那个外面的地方,一切正常 –

0

简短的回答是:

更新状态LEFT JOIN操作在Actions.id = State.id SET持续时间= FLOOR(AVG(持续时间))其中Actions.id IN(从动作中选择id,其中Actions.id = state.id和type ='started'GROUP BY Actions.id)

可能在语法上不完全正确。

+0

这是不正确的。它会将所有这些数据平均。 –