MySQL обновляет строки, если каждый столбец равен одному значению

0

У меня есть таблица вроде этого:

----------------------------------------------------------
|                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, обновить их"

Хотелось бы помочь!

Теги:
database

3 ответа

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 
  • 0
    Я получаю синтаксическую ошибку # 1064 с вашим запросом
  • 0
    @ Komarzer только что обновил его, удалил where в подзапросе
Показать ещё 2 комментария
0

Вы можете использовать его 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);
0

Одним из возможных решений является,

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;
  • 0
    Я думаю, что вы имеете в виду actions.user_id вместо temp.user_id? Кажется, работает так

Ещё вопросы

Сообщество Overcoder
Наверх
Меню