2013-03-11 24 views
0

我有2個表:MySQL查詢選擇非會員

Customers: 
- ID 
- NAME 

Modulemembers: 
- ID 
- customer_id 
- enabled 

我使用它來使我的網站針對某些客戶的一個功能。 我有一個網站的管理員可以爲客戶添加模塊的表單,所以我需要一個查詢,查找不是modulemembers表的成員的客戶。

我做了這個:

SELECT customers.id, 
     customers.name 
FROM customers, 
     modulemembers 
WHERE customers_id != modulemembers.cust_id 
ORDER BY customers.name 

,但它不工作。我究竟做錯了什麼?

回答

4

您可以使用NOT EXISTSWHERE子句中得到的結果:

SELECT c.id, 
    c.name 
FROM customers c 
WHERE not exists (select customer_id 
        from modulemembers m 
        where c.id = m.customer_id) 
order by c.name 
+0

這是最好的答案 – swasheck 2013-03-11 20:56:11

+0

+1不使用'LEFT OUTER JOIN' – Kermit 2013-03-11 20:57:02

2

您可以使用LEFT OUTER JOIN和基於NULLs的過濾器。以下查詢將從customers表和modulemembers表中提取所有結果。如果在modulemembers表中沒有匹配,那麼custid將是NULL

SELECT c.id, c.name 
FROM customers c 
    LEFT OUTER JOIN modulemembers m ON c.customers_id = m.cust_id 
WHERE m.custid IS NULL 
ORDER BY c.name 
+0

都工作。 'NOT EXISTS'在這裏比較好,不過因爲'modulemembers'不需要數據。這是一個反半連接,只測試存在。 – swasheck 2013-03-11 20:55:53

+4

@Max現在變得更加明確,通常可以超過輸入更多信息的巨大而痛苦的代價。你也可以編寫舊樣式的連接來輸入更少,或者SELECT *等, – 2013-03-11 20:56:53

+0

@AaronBertrand謝謝。對我來說,當它說'左外連接'時更爲明顯。沒有機會讓它與'JOIN'混淆# – 2013-03-11 20:58:51

0

嘗試是這樣的:

SELECT c.ID AS customerId, 
      c.NAME AS fullName, 
      m.ID AS memberId 
    FROM Customers AS c 
LEFT JOIN Modulemembers AS m ON m.customer_id = c.ID 
    WHERE m.ID IS NULL;