У меня есть таблица вроде этого:
----------------------------------------------------------
| Actions |
----------------------------------------------------------
| action_id | user_id | action_active | action_cancelled |
----------------------------------------------------------
| 1 | 1 | 0 | 0 |
----------------------------------------------------------
| 2 | 2 | 1 | 0 |
----------------------------------------------------------
| 3 | 1 | 0 | 0 |
----------------------------------------------------------
| 4 | 2 | 0 | 0 |
----------------------------------------------------------
Я хочу обновить все action_cancelled до 1 для user_id, если у пользователя есть каждая из его строк как action_active = 0. Если у него есть хотя бы одно action_active как 1, не обновляйте.
В этом примере он должен обновить action_cancelled до 1 для строк 1 и 3, потому что пользователь 1 имеет каждое из его action_active в 0.
Я подумал о чем-то подобном, но я не уверен, насколько это правильно:
UPDATE actions
SET a.active_cancelled = 1
WHERE (SELECT p.user_id, SUM(p.action_active) as sum_p FROM actions p GROUP BY user_id WHERE a.user_id = p.user_id AND sum_p = 0);
Я застрял там в ГДЕ. Как я могу сказать "если пользователь имеет все свои строки как action_active = 0, обновить их"
Хотелось бы помочь!
Вы можете использовать HAVING
и JOIN
чтобы сделать это
UPDATE actions a
JOIN
(
SELECT p.user_id, SUM(p.action_active) as sum_p
FROM actions p
GROUP BY user_id
HAVING sum_p = 0)
b ON a.user_id=b.user_id
SET a.action_cancelled = 1
Вы можете использовать его not exists
:
update t
set t.active_cancelled = 1
where not exists (select 1 from t t1 where t1.user_id = t.user_id and t1.action_active = 1);
Одним из возможных решений является,
update actions
inner join(
select user_id,sum(if(action_active=1,1,0))as inactive from actions group by
user_id having inactive=0
)as B on B.user_id=temp.user_id
set actions.action_cancelled=1;
where
в подзапросе