如果每列都相同,则MySQL获取行

时间:2018-07-31 07:47:50

标签: mysql sql database

我有一个像这样的桌子:

---------------------------------------
|                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) 

我不确定我的查询是否正确。

谢谢!

2 个答案:

答案 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