我有一个像这样的桌子:
---------------------------------------
| 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)
在子查询中计算总和,以找到全为零的用户并将其与主选择一起加入
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
答案 1 :(得分:1)
使用B
:
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