2016-04-05 102 views
0

出現選擇值我有3個表:不映射表

================ 
| contacts  | 
================ 
| id | name | 
================ 

================ 
| contact_map | 
================ 
| cid | lid | 
================ 

================ 
| contact_list | 
================ 
| id | name | 
================ 

我需要找到一個未分配到一個列表中的所有聯繫人。 cid in contact_map is id in contacts and lid in contact_map is id in contact_list

選擇與lid聯繫是相對容易的,但我不知道如何選擇那些沒有lid的。

任何幫助?

回答

1

您可以使用not existsnot in

select c.* 
from contacts c 
where not exists (select 1 
        from contact_map cm 
        where cm.cid = c.id 
       ); 

如果你想不分配給特定列表中的聯繫人,然後就包含在子查詢的信息:

select c.* 
from contacts c 
where not exists (select 1 
        from contact_map cm 
        where cm.cid = c.id and cm.lid = $lid 
       ); 
+0

你稱這種類型的查詢是什麼?帶有子查詢的查詢?它有一個特定的名字嗎?並感謝您的答案,現在將進行測試 – Albert

+0

這些是「where」子句中相關子查詢的示例。 –

1

我不您認爲您實際上需要使用contact_list表,因爲contact_map表允許您確定哪些聯繫人已添加到列表中。作爲戈登答案的替代方案,您可以將LEFT JOINcontacts表格更改爲contact_map,並保留任何記錄,其中不是映射到的任何內容。

SELECT c.* 
FROM contacts c LEFT JOIN contact_map cm 
    ON c.id = cm.cid 
WHERE cm.cid IS NULL 
+0

感謝您的回答。我也會看看。 :) – Albert