2010-05-17 165 views
0

這個SQL有什麼問題?它應該返回的結果,但沒有返回MySQL連接問題

SELECT `pid` 
    FROM `products` 
    LEFT JOIN `prods_to_features` 
    ON (`ptf_pid` = `pid`) 
WHERE ( `ptf_id` = '66' 
     OR `ptf_id` = '67' 
     ) 
    AND (`ptf_id` = '76') 

它是不可能有第二個,其中已在左邊被用來子句表連接?

+2

如果您有任何問題像這樣,我建議從基礎開始並添加碎片直到它斷裂。例如,通過刪除整個where子句,顯而易見,加入正確運行 – 2010-05-17 14:48:39

回答

4

正如其他人所說,WHERE子句是沒有意義的。

我會猜測你想要說的是你想要的產品具有功能-76和功能66-或-67。您將需要兩個連接爲:

SELECT DISTINCT products.pid 
FROM products 
JOIN prods_to_features AS ptf1 ON ptf1.ptf_pid=products.pid 
JOIN prods_to_features AS ptf2 ON ptf2.ptf_pid=products.pid 
WHERE ptf1.ptf_id='76' 
AND ptf2.ptf_id IN ('66', '67') 

的DISTINCT是保證返回的情況下,只有一個產品的拷貝,其中一個產品有兩個特點66和67

+0

多數民衆贊成我正在嘗試做!這不工作雖然:( – robjmills 2010-05-17 15:20:48

+2

我的錯誤,它實際上! – robjmills 2010-05-17 15:23:27

+3

+1閱讀OP的頭腦。 – 2010-05-17 16:37:34

7

看看你的WHERE子句。

您不能同時有一個值爲(66 OR 67) AND 76。每行都將爲表達式返回false,所以不會返回任何行。

5

該問題與您的加入無關。

您檢查

(`ptf_id` = '66' OR `ptf_id` = '67') AND (`ptf_id` = '76') 

這是一樣的

(`ptf_id` = '66' AND `ptf_id` = '76') 
OR (`ptf_id` = '67' AND `ptf_id` = '76') 

這意味着ptf_id = 66 = 76ptf_id = 67 = 76是,嗯,不太可能。

+2

對我們這一代計算機來說不是不可能,但是不可能。與量子計算它可能;) – knittl 2010-05-17 14:46:07

+0

...但我有頁面值得「證明」1 = 2 – 2010-05-17 14:46:46

2

問題是您要求它返回來自prods_to_features的記錄,該記錄對於ptf_id(Where子句中的AND)有兩個不同的值。

我懷疑你的意思是pid你的Where子句中的ptf_id的一個或兩個。這取決於你想要做什麼。

2

你的布爾邏輯是有缺陷的。

WHERE(ptf_id = 66或67)和(ptf_id = 76)

這永遠不會工作。