MySQL查询 - 帮助选择

时间:2010-02-08 23:14:49

标签: mysql drupal

我正在尝试的是让所有没有为fid = 13设置值的用户或者在profile_values中根本没有值。我猜这有一个简单的解决方案,...但我只是没有看到它。非常感谢任何帮助或正确方向上的一点。

(表users和profile_values都来自Drupal。)

简化值:

uid   name  fid     value
1   user1    1       foo
1   user1    2       foo
2   user2    12      
2   user2    13      1265662514
3   user3    NULL    NULL
4   user4    NULL    NULL

我在尝试什么:

SELECT u.uid, u.name, pv.fid, pv.value
FROM users u 
LEFT JOIN profile_values pv ON pv.uid = u.uid  
WHERE u.status != 0
AND (pv.fid != 13 OR pv.fid IS NULL) 
GROUP BY u.uid

uid     name      fid     value
1     user1     1       foo
2     user2     12      foo 
3     user3     NULL    NULL
4     user4     NULL    NULL

我的问题是user2,它不应该存在,因为它的值在fid = 13


感谢所有令人难以置信的快速和合格的答案,欢呼!

4 个答案:

答案 0 :(得分:1)

WHERE NOT EXISTS(SELECT 1 FROM profile_values pv WHERE pv.uid = u.uid AND pv.fid = 13)

这实际上是一个缓慢的解决方案,但我无法实现任何其他方式

答案 1 :(得分:1)

您想要添加AND子句:     AND u.uid NOT IN(从fid = 13的profile_values中选择uid)作为bad_uids

答案 2 :(得分:0)

也许试试

AND (pv.fid != 13 OR pv.value IS NOT NULL)

你的条件不太清楚:

  

获取没有为fid = 13设置值的所有用户或者在profile_values中没有值

这意味着“让fid的所有用户都等于13以外的东西并且在profile_values中有一些值”?

答案 3 :(得分:0)

您只需要值为空的配置文件且fid不是13,对吗?这意味着如果两者都为真,或者如果两者都为真,则跳过这些记录。所以不要将它们组合在一起并使用OR。使用和:

WHERE 
u.status != 0
AND 
pv.fid != 13 
AND
pv.fid IS NOT NULL 

OR

WHERE 
u.status != 0
AND 
pv.fid IS NOT (13 OR NULL)