2010-02-08 80 views
4

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

(在表用户和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


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

回答

1

你想要添加一个AND子句: AND u.uid NOT IN(从profile_values where fid = 13中选择uid)bad_uids

+0

这不起作用。看看我和安东尼的讨论 – zerkms 2010-02-08 23:44:11

+0

实际上,这似乎与OR(pv.fid = 13 AND pv.value ='')结合起来......除非我忽略了某些东西 – Borgenk 2010-02-08 23:53:38

+0

@Borgenk:为什么不是我的? ;-)你有没有尝试看看这个提议解释? ;-) – zerkms 2010-02-09 03:10:30

0

也许尝试

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

你的条件有点不清楚:

得到没有在profile_values为FID = 13或没有值设置为一个数值,所有用户

这意味着“让所有用户与FID等于13以外的东西,并在profile_values中有一些值“?

+0

,这将选择用户2 - 12,因为12 = 13和12 IS NOT NULL – zerkms 2010-02-08 23:25:34

+0

难道他们不想user2的? – Anthony 2010-02-08 23:36:39

+0

对不起,我正在看问题的错误部分。为什么user2显示两次?没有唯一的ID本身就是一个问题,对吗? – Anthony 2010-02-08 23:39:52

1

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

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

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

http:// stackoverflow。com/questions/2225622/mysql-query-help-with-selection/2225646#2225646 - 看看我的评论 – zerkms 2010-02-08 23:33:24