2015-07-23 2 views
1

У меня есть две таблицы, таблица А имеет столбцы маркер (первичный ключ) и простои (INT), Таблица B имеет столбцы маркер, статус (ENUM с 3 состояниями: active, unstable, inactive), продолжительность (INT).MySql оператор UPDATE с SELECT, данные обобщающих из таблицы 2

Я хочу суммировать длительность из Таблицы B, только для состояний unstable и inactive. И после этого, присвоить результат колонка простоя из таблицы А.

Так, например,

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. Может кто-нибудь мне помочь?

ответ

1

В MySQL вы можете использовать присоединиться и обновить что-то, как

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 
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 
+0

Привет, и спасибо за ответ. Это вполне может устранить проблему, но неплохо добавить некоторое объяснение того, что вы изменили, и почему это решает проблему. Здесь есть куча новичков, и они могут узнать кое-что из вашего опыта. Не забывайте, что то, что может быть очевидно для вас, может быть не для них ... –

0

Ваша идея использовать подзапрос в обновлении будет хорошо, вам просто нужно реорганизовать его:

UPDATE A 
SET downtime = (SELECT SUM(duration) FROM B WHERE state != 'active' AND A.token = B.token); 
Смежные вопросы