我正在尝试的是让所有没有为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
中感谢所有令人难以置信的快速和合格的答案,欢呼!
答案 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)