2012-10-17 60 views
1

我有以下模式:Mysql的選擇行不是表錯誤

product: id , title 
client: id, name 
client_has_product:id, id_product, id_client, date. 

我想要得到的一切不屬於某個客戶的產品清單。

我運行下面的查詢:

SELECT DISTINCT product.id, product.title, client.id 
FROM product,client 
WHERE product.id NOT IN (
SELECT id_product FROM client_has_product WHERE id_client = 1) 
GROUP BY product.id 

問題是,如果client_has_product表是空的查詢返回什麼,但如果連一行在client_has_product表的查詢工作。

有人可能請解釋我在這裏失蹤和/或爲什麼發生這種情況?

+0

WHERE id_client)?該查詢看起來不完整 – Anshu

+0

我修復了它,對此感到抱歉:-) – ndp

+2

使用連接而不是子查詢和空值過濾器 –

回答

1

問題的行這裏是

WHERE product.id NOT IN (
SELECT id_product FROM client_has_produc WHERE id_client) 

因爲這將始終返回false時

WHERE product.id NOT IN (null) 

此外,表格的這個聯盟沒有交集會返回一個配對的所有行。

FROM product,client 

而這總是會產生一種產品,即使有2個或多個客戶端具有相同的產品。

GROUP BY product.id 

解決辦法是做所有表上的一個join,然後篩選出特定的客戶端。

SELECT DISTINCT product.id, product.title, client.id 
FROM product 
LEFT JOIN client_has_produc ON product.id = client_has_produc.id_product 
LEFT JOIN client ON client.id = client_has_produc.id_client 
WHERE client_has_product.id_client <> 1 
1

就應該更換不符合JOIN,下面是一個例子:

/NOT IN查詢/

USE AdventureWorks; 
GO 
SELECT ProductID 
FROM Production.Product 
WHERE ProductID 
NOT IN (
SELECT ProductID 
FROM Production.WorkOrder); 

/連接查詢/-

SELECT p.ProductID 
FROM Production.Product p 
LEFT JOIN Production.WorkOrder w ON p.ProductID = w.ProductID 
WHERE w.ProductID IS NULL; 

希望有幫助!