2013-03-11 74 views
1

我需要从mysql数据库获取记录;在这个表格中有一个与用户关联的动作列表。我需要获得列操作= 3和列操作= 5的所有用户;例如,如果用户nr。 4有一个行动= 3和另一个行动= 5的记录我明白了;如果用户只有一个动作= 3或动作= 5的记录,我不能得到它。如果我写这个查询如果值相同user_id,请选择记录

SELECT * 
FROM user_action 
WHERE action = 3 AND action = 5 

我总是得到0条记录。如果我写OR或者而不是AND,即使用户没有这两个值,我也会得到action = 3或action = 5的所有记录。我该怎么办?

回答

4

这个问题在一定程度上被称为Relational Division

SELECT userID 
FROM user_action 
WHERE action IN (3,5) 
GROUP BY userID 
HAVING COUNT(DISTINCT action) = 2 

如果action是每个userID独一无二的,你可以直接COUNT()的记录,而不DISTINCT

SELECT userID 
FROM user_action 
WHERE action IN (3,5) 
GROUP BY userID 
HAVING COUNT(*) = 2 

;最后,如果你想获得用户的整个细节,你需要自己加入吧,

SELECT a.* 
FROM user_action a 
     INNER JOIN 
     (
      SELECT userID 
      FROM user_action 
      WHERE action IN (3,5) 
      GROUP BY userID 
      HAVING COUNT(*) = 2 
     ) b ON a.userID = b.userID 
+0

超!谢谢!! – pindol 2013-03-11 13:44:53

+0

是的,现在它完美。我把它设置为正确的答案 – pindol 2013-03-11 15:34:05

+0

很高兴它帮助':D' – 2013-03-11 15:34:26

相关问题