2012-02-10 103 views
0

這是一個隨機問題,我一直在使用MySQL中的多個查詢和一小部分PHP進行此操作。使用MySQL使用LEFT JOIN返回結果,其中一個表不包含記錄

我有一個MySQL查詢:

SELECT * 
FROM (reviews LEFT JOIN orders ON reviews.orderid = orders.orderid) 
LEFT JOIN customers ON orders.custid = customers.id 
WHERE customers.email = '$email' 

返回從特定客戶的所有產品評價。

我想知道構造一個單獨的查詢,它將返回尚未審查的所有客戶訂單。也就是說,在評論表中沒有特定orderid的記錄。

所以......

SELECT * 
FROM orders LEFT JOIN customers ON orders.custid = customers.id 
WHERE customers.email = '$email' 

...這將返回所有客戶的訂單,但後來我想也許是使用其他WHERE子句和LEFT JOIN,因此現在只有訂單ID的,沒有相應的審查記錄回。我一直在試圖找到一些能夠做到這一點的東西,現在沒有任何運氣。似乎沒有任何工作。如上所述,我已經設法使用PHP/MySQL的組合,但它不是非常高效,所以我想知道是否有人有任何建議?

在此先感謝。

瑞安

+2

在你的'WHERE'子句中添加'WHERE ... AND orders.orderid NOT IN(SELECT orderid FROM reviews)'。或'WHERE ... AND NOT EXISTS(SELECT * FROM reviews r WHERE r.orderid = orders.orderid)' – 2012-02-10 01:13:48

+0

@ypercube您的評論擊敗了我的回答,很高興我們在同一頁面上雖然 – shaunhusain 2012-02-10 01:18:11

+0

@ypercube:雅男人,發表那些答案! – 2012-02-10 01:20:30

回答

1
SELECT * 
FROM customers 
    JOIN orders 
    ON orders.custid = customers.id 
WHERE customers.email = '$email' 
    AND orders.orderid NOT IN 
     (SELECT orderid FROM reviews) 

...也許

+0

謝謝。完善! – Ryan 2012-02-10 01:57:08

1

你嘗試呢?

SELECT orders.* FROM orders 
LEFT JOIN customers ON orders.custid = customers.id 
LEFT JOIN reviews ON reviews.orderid=orders.id 
WHERE customers.email = '$email' AND reviews.orderid IS NULL 

,應返回所有未查看訂單郵件$電子郵件的客戶

0

試試這個:

SELECT * 
FROM orders a LEFT JOIN customers b ON a.custid = b.id 
WHERE b.email = '$email' AND 
     a.orderid NOT IN (SELECT orderid FROM reviews) 
0

您可以LEFT JOIN客戶/訂單到reviews,並沒有相應的review選擇行:

SELECT * 
FROM orders LEFT JOIN customers ON orders.custid = customers.id 
LEFT JOIN reviews ON reviews.orderid = orders.orderid 
WHERE customers.email = '$email' 
AND reviews.orderid IS NULL 
0

這將工作,但可能會很慢。

SELECT * 
FROM orders 
LEFT JOIN customers 
    ON orders.custid = customers.id 
WHERE customers.email = '$email' 
AND orders.orderid NOT IN (SELECT orderid FROM reviews) 

這會更快。

SELECT orders.orderid 
FROM orders 
LEFT JOIN customers 
    ON orders.custid = customers.id 
LEFT JOIN reviews 
    ON reviews.orderid = orders.orderid 
WHERE customers.email = '$email' 
GROUP BY orders.orderid 
HAVING count(reviews) = 0 
+0

'NOT IN'子查詢不具有性能問題AFAIK。 – 2012-02-10 01:25:50