2015-10-05 53 views
0

我想查詢我們的數據庫以提取客戶數據。關鍵部分是:與MySQL並肩作戰不存在

拉出所有未購買的客戶/訂單product_a

這將列出已購買的客戶/訂單,product_b,product_c和product_d。

但它需要確保客戶還沒有購買過product_a。我需要排除他們。

這是否正確的方式去關於NOT EXISTS?我仍然覺得它包含了一些買了product_a的記錄。

SELECT 
    * 
FROM 
    orders 
JOIN customers AS cus ON orders.CustomerNumber = cus.CustomerNumber 
WHERE 
    product != 'product_a' 
OR (
    HomeTelephone = '' 
    AND MobileTelephone != '' 
) 
AND NOT EXISTS (
    SELECT 
     OrderNumber 
    FROM 
     orders AS o 
    JOIN customers AS c ON o.CustomerNumber = c.CustomerNumber 
    WHERE 
     c.EmailAddress = cus.EmailAddress 
    AND Product = 'product_a' 
    AND completed = 1 
) 
ORDER BY 
    orderdate 

如果沒有NOT EXISTS語句,即使他們單獨購買了product_a,也可以包含客戶記錄嗎?

+0

你的問題是你'WHERE'子句中的'或'。它將包括那些有'HomeTelephone =''和MobileTelephone!='''的記錄。你對這部分查詢的意圖是什麼? –

+0

在where子句中...將括號放在產品之前和OR括號之後,以查看查詢處理器實際上在做什麼。然後分析你真的想做什麼。 OR可能不在你想象的地方工作。 –

回答

1

您的不存在是有點關閉和where product != 'product_a'是多餘的。

SELECT 
    * 
FROM 

    orders AS o1 
    JOIN customers AS cus ON o1.CustomerNumber = cus.CustomerNumber 
WHERE 
    cus.HomeTelephone = '' 
    AND cus.MobileTelephone != '' 
    AND NOT EXISTS (
     SELECT 
      1 
     FROM 
      orders o2 
     WHERE 
      o2.CustomerNumber = cus.CustomerNumber 
      AND Product = 'product_a' 
      AND completed = 1 
    ) 
ORDER BY 
    o1.orderdate 

這會給你的客戶他們的訂單。根據您的描述,如果您只需要客戶信息,則可以在查詢的第一部分中排除加入訂單,並使用「不存在」來確定該客戶是否購買了product_a。

SELECT 
    * 
FROM 
    customers cus 
WHERE 
    HomeTelephone = '' 
    AND MobileTelephone != '' 
    AND NOT EXISTS (
     SELECT 
      1 
     FROM 
      orders o 
     WHERE 
      o.CustomerNumber = cus.CustomerNumber 
      AND Product = 'product_a' 
      AND completed = 1 
    ) 
+0

你是第一次查詢SEEMS是一個將會得到這個工作的人 - 但子查詢正在匆匆離開。我不知道我還能做些什麼來優化它。沒有它的幾秒鐘,它似乎無限! –

+0

訂單表是否有客戶編號索引?或產品?或完成? – JamieD77

+0

這就是它!謝謝!現在超級快。 –

0
SELECT c.* 
    FROM customers c 
    LEFT 
    JOIN orders o 
    ON o.CustomerNumber = c.CustomerNumber 
    AND o.product = 'product_a' 
WHERE o.CustomerNumber IS NULL