2017-05-05 25 views
1

我有一個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表2的keyID價值,我怎麼能執行這個條目的1

val所有用戶?

編輯:我忘了說明,任何用戶可能在user-keys表中的多個條目,我只是想從useruserID一個列表,所以我真的很希望從上表的結果只會是8384.

+0

指定您正在使用的SQL產品。 – Sankar

+0

@SankarRaj MySQL – Chud37

回答

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所有用戶2的keyID,或者誰做不出現在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 
+0

感謝您的回答,我編輯了我的問題,因爲我沒有正確地說出來。請再檢查一次! – Chud37

+0

我的天哪,我從來沒有見過這樣的'LEFT JOIN'。這似乎工作!謝謝!爲了仔細檢查它,我將如何修改它以僅顯示工作人員? – Chud37

+0

非常感謝您的幫助。對此,我真的非常感激。我無法理解那一個!我學到了一些東西! – Chud37

1

如果你想與keyid的<> 2的用戶應該使用內連接

SELECT u.userID 
    FROM users u 
    and u.userID not in (select userID 
    from `user-keys` 
    WHERE keyID <>2) 
+0

感謝您的回答,我編輯了我的問題,因爲我沒有正確地說出來。請再檢查一次! – Chud37

+0

答案已更新..並未在條款 – scaisEdge

+0

中我通常建議'NOT EXISTS'而不是'NOT IN'。 (NOT IN時的NULL行爲對許多用戶來說有點令人驚訝......) – jarlh

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;