У меня есть таблица вроде этого:
---------------------------------------
| 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)
Я не уверен, что мой запрос прав.
Спасибо !
Вычислить сумму в подзапросе, чтобы найти пользователей со всеми нулевыми значениями и присоединиться к ним с помощью основного выбора
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
Использовать 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;