带有SELECT的MySql UPDATE语句汇总了表2中的数据

时间:2015-07-23 17:02:32

标签: mysql sql

我有两个表,表A有列令牌(主键)和停机时间INT),表B有列令牌< / em>,状态ENUM包含3个州:activeunstableinactive),持续时间INT)。

我想从表B中总结持续时间,仅针对状态unstableinactive。然后,将结果分配给表A中的列停机时间

所以,例如,

TABLE A
=======

token             downtime
--------------------------

bv87pxicnrtk8pw       null
v3525kq2kzihb9u       null

TABLE B
=======
token                 state       duration
------------------------------------------
v3525kq2kzihb9u      active              9
v3525kq2kzihb9u    unstable             20
v3525kq2kzihb9u    inactive             60
bv87pxicnrtk8pw    unstable             11
bv87pxicnrtk8pw      active            140
bv87pxicnrtk8pw    inactive             40

RESULT
======
token             downtime
--------------------------

bv87pxicnrtk8pw         51
v3525kq2kzihb9u         80

我试过

UPDATE A
SET downtime = (SELECT SUM(duration) FROM B WHERE state != 'active' GROUP BY token)
WHERE A.token = B.token;

但没有成功。

SQL中的新手。任何人都可以帮助我吗?

3 个答案:

答案 0 :(得分:1)

在mysql中,您可以使用join和update of something

update tablea a
join(
  select 
  token,sum(duration) as duration from tableb
  where state != 'active'
  group by token
)b
on b.token = a.token
set a.downtime = b.duration

答案 1 :(得分:0)

试试这个:

UPDATE A a
    INNER JOIN (
        SELECT SUM(duration) AS s
        FROM B
        WHERE state <> 'active'
        GROUP BY token  
    ) b ON a.token = b.token
SET a.downtime = b.s

答案 2 :(得分:0)

您在更新中使用子查询的想法很好,您只需要重新组织它:

UPDATE A
SET downtime = (SELECT SUM(duration) FROM B WHERE state != 'active' AND A.token = B.token);