我有一个user
表:
id, userID, name, postcode
2 99 Bob AAA BBB
3 8384 Jim CCC DDD
我有一张user-keys
表:
id, userID, keyID, val
1 435 3 1
2 773 8 0
3 99 2 1
4 99 5 1
5 99 2 1
keyID
= 2表示它是工作人员。我想从user
表中获取非工作人员的所有用户ID。到目前为止,我有以下SQL:
SELECT u.`userID` FROM `users` u
WHERE u.`userID` IS NOT NULL AND u.`userID` != 0;
但是,这并不排除user-keys
表中的keyID
值为2且val
为1的所有用户。
我该怎么做?
编辑:我忽略了声明任何用户可能在user-keys
表中有多个条目,我只想从userID
表中找到一个user
列表,所以结果真的如此我从上面的表中寻找的只是8384。
答案 0 :(得分:1)
您可以尝试以下连接查询:
SELECT
t1.userID
FROM user t1
LEFT JOIN
(
SELECT DISTINCT userID, keyID -- you don't need DISTINCT here, but it may help
FROM `user-keys` -- and it makes the logic a bit clearer
WHERE keyID = 2
) t2
ON t1.userID = t2.userID
WHERE t2.userID IS NULL
此处使用的逻辑是,我们会保留user
表中未user-keys
中keyID
出现的所有用户,或者user-keys
中未出现的用户完全没有。
按照以下链接在MySQL中进行演示。请注意,在某些数据库中,user-keys
不是有效的表名,需要进行转义(我使用反引号转义,SQL Server将使用[user-keys]
等)。
<强>更新强>
如果您只想找到工作人员,那么逻辑就会简单得多。在这种情况下,我们可以只将INNER JOIN
两个表放在一起并检查每个用户的状态:
SELECT DISTINCT
t1.userID
FROM user t1
INNER JOIN `user-keys` t2
ON t1.userID = t2.userID
WHERE t2.keyID = 2
答案 1 :(得分:1)
如果您希望用户使用keyID&lt;&gt; 2你应该使用内连接
SELECT u.userID
FROM users u
and u.userID not in (select userID
from `user-keys`
WHERE keyID <>2 )
答案 2 :(得分:0)
您可以使用以下代码
SELECT * FROM USER WHERE ID IN
(SELECT ID FROM USER_KEY WHERE KEY_ID <> 2);
如果您需要所有可以使用的列,
SELECT * FROM USER U
INNER JOIN USER_KEY UK
ON(U.ID = UK.ID)
WHERE UK.KEYID <> 2;