MySQL выбирает строки, если все столбцы равны

0

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

---------------------------------------
|                Actions              |
---------------------------------------
| action_id | user_id | action_active |
---------------------------------------
|     1     |    1    |       0       |
---------------------------------------
|     2     |    2    |       1       |
---------------------------------------
|     3     |    1    |       0       |
---------------------------------------
|     4     |    2    |       0       |
---------------------------------------

Я хочу получить все строки, где пользователь имеет все свои строки как action_active = 0. Если он имеет только один action_active как 1, не извлекайте его. В этом примере он должен только извлекать строки 1 и 3, так как пользователь 1 имеет все свои строки в action_active = 0.

Я подумал о чем-то подобном, но я не уверен, насколько это правильно:

SELECT *
FROM Actions AS a
WHERE action_active = ALL (SELECT action_active FROM actions as s WHERE action_active = 0 where a.idx_user = s.idx_user) 

Я не уверен, что мой запрос прав.

Спасибо !

  • 0
    Так что, если у пользователя более 1 строки, где action_active = 1? Должно ли это быть восстановлено тоже? В вашем сценарии пользователь с user_id = 2
  • 0
    Я не хочу получить это. Мой запрос может быть неправильным, поэтому я прошу помощи. Я не уверен, как написать этот запрос. Я только хочу получить пользователей, которые имеют только 0 как action_active для каждой из их строк.
Показать ещё 2 комментария
Теги:
database

2 ответа

1
Лучший ответ

Вычислить сумму в подзапросе, чтобы найти пользователей со всеми нулевыми значениями и присоединиться к ним с помощью основного выбора

SELECT a.* 
FROM actions a
JOIN (SELECT user_id, SUM(action_active) AS sum 
      FROM actions 
      GROUP BY user_id) AS sum_a ON sum_a.user_id = a.user_id
WHERE sum = 0
  • 0
    Спасибо, похоже, работает!
1

Использовать NOT EXISTS:

SELECT a.* 
FROM actions a
WHERE NOT EXISTS (SELECT 1
                  FROM actions a2
                  WHERE a2.user_id = a.user_id AND
                        a2.action_active <> 0
                 );

Это должно иметь лучшую производительность, чем решение, использующее group by - и это позволяет прямо использовать индекс для actions(user_id, action_active).

Вы также можете сделать это с помощью LEFT JOIN:

SELECT a.* 
FROM actions a LEFT JOIN
     actions a2
     ON a2.user_id = a.user_id AND a2.action_active <> 0
WHERE a2.user_id IS NULL;

Ещё вопросы

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