2013-05-11 57 views
-1

在我的PHP/MySQL的應用程序,我有3個表來存儲產品/功能信息:SQL連接(包含/排除)不工作

 
product 
id  brand  ref  mod 
2675 Brand 1 123456 Model X 
3644 Brand 2 78910 Model Y 
3984 Brand 3 35532 Model Z 

function 
id name   active sort_order 
0 NONE   1   0 
1 Function 1 1   0 
2 Function 2 1   0 
3 Function 3 1   0 

product2function 
id product_id function_id 
2 2675   1 
3 3644   1 
4 3644   2 
5 3984   1 

表product2function用來使產品和之間的聯繫功能(S)可用。

一個產品可以有一個或多個功能。

使用JOIN獲取給定產品ID的可用函數的SQL查詢不是問題,它工作正常。

現在我需要建立一個SQL查詢應返回更精確的結果:

在例子中,我需要檢索的所有產品(第),具有唯一的功能1(ID = 1)。不是功能1,也許是一個或許多其他,只有功能1.

在我的情況下,這意味着產品3644不應該返回,因爲它有功能ID = 1和功能ID = 2。

我試圖用IN語法得到預期的結果,但沒有成功。

非常感謝您的幫助。

回答

1
SELECT a.id, a.brand 
FROM product a 
     INNER JOIN product2function b 
      On a.ID = b.product_id 
WHERE b.function_id = 1 AND 
     EXISTS -- this part checks the number of functions of the product 
     (
      SELECT 1 
      FROM product2function c 
      WHERE c.product_id = b.product_id 
      GROUP BY c.product_id 
      HAVING COUNT(DISTINCT function_id) = 1 
     ) 
GROUP BY a.id, a.brand 
HAVING COUNT(*) = 1 

預期輸出

╔══════╦═════════╗ 
║ ID ║ BRAND ║ 
╠══════╬═════════╣ 
║ 2675 ║ Brand 1 ║ 
║ 3984 ║ Brand 3 ║ 
╚══════╩═════════╝ 

的問題部分指出:」。我需要檢索的所有產品只具有功能1(S)(id = 1)不是功能1,也許是一個或許多其他,只有功能1「。

0
SELECT * FROM product pr 
WHERE EXISTS (
    -- all the products that have a Function=1 
    SELECT * 
    FROM product2function ex 
    WHERE ex.product_id = pr.id 
    AND ex.function_id = 1 
) 
AND NOT EXISTS (
    -- ... but don't have an other function than 1 
    SELECT * 
    FROM product2function nx 
    WHERE nx.product_id = pr.id 
    AND nx.function_id <> 1 
) 
    ; 
+0

感謝wildpasser,你的代碼是exactely我所需要的。因爲我可以指定多個函數來包含和排除,所以我使用ex.function_id IN(1,2,...)來更改where子句。 – 2013-05-11 15:55:26

+0

尊敬的野人,恐怕我需要重新打開這個問題,因爲,您昨天給出的解決方案正在工作,只要我需要檢查一個函數。 在上面描述的數據中,如果我只需要檢查函數= 1,它就可以工作。 由於我的產品可以有多個功能,我需要能夠建立一個SQL查詢返回,即只有產品function = 1和功能= 2。 不應返回只有函數= 1或函數= 2的產品。 我試圖添加AND到where子句,不幸沒有成功。 希望你能幫助我。 – 2013-05-12 19:58:09