排除职员

时间:2017-05-05 08:10:48

标签: mysql sql

我有一个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。

3 个答案:

答案 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-keyskeyID出现的所有用户,或者user-keys中未出现的用户完全没有。

按照以下链接在MySQL中进行演示。请注意,在某些数据库中,user-keys不是有效的表名,需要进行转义(我使用反引号转义,SQL Server将使用[user-keys]等)。

Rextester

<强>更新

如果您只想找到工作人员,那么逻辑就会简单得多。在这种情况下,我们可以只将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;