MySQL查询 - 如何选择

4
我想要的是获取所有没有设置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

我的问题是用户2,它不应该存在,因为它在fid = 13中有一个值。


感谢所有快速而专业的回答,干杯!

4个回答

1

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

这其实是一个慢速解决方案,但我想不出其他的方法了。


1
你想要添加一个AND子句: AND u.uid NOT IN(select uid from profile_values where fid = 13)作为bad_uids

这是行不通的。请看下面我和安东尼的讨论。 - zerkms
实际上,结合OR运算符似乎可以解决这个问题(pv.fid = 13 AND pv.value = '')……除非我漏看了什么。 - Borgenk
@Borgenk:为什么不挖矿呢?;-) 你试过看看这个提案的解释吗?;-) - zerkms

0

或许尝试一下

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

?

您的条件有点不太清楚:

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

这是指“获取所有fid不等于13且在profile_values中有某些值的用户”吗?


这将选择用户2-12,因为12!= 13且12不是NULL。 - zerkms
哦,抱歉,我看错了问题的一部分。为什么用户2会出现两次?没有唯一的ID本身就是一个问题,对吧? - Anthony
不是,错误的。问题中的第一个表是参数表。每个参数一行。因此,如果用户有N个参数,则在该表中将有N行。而在选择时,如果用户具有fid = 13,则必须从查询结果中排除整个用户。 - zerkms

0

你只想要值不为空且fid不为13的档案,对吗?这意味着如果两者都为真或任一为真,则跳过这些记录。因此,不要将它们分组并使用OR,而是使用AND:

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

或者

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

请看我在这里的评论:https://dev59.com/8EvSa4cB1Zd3GeqPhtmC#2225646 - zerkms

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接