2012-03-14 202 views
1

我有如下表(tbl_product_rel):從一個表中選擇記錄

id product_id attr_id 
1  1   10 
2  1   15 
3  1   20 
4  2   6 
5  2   9 
6  3   10 
7  3   15 
8  3   20 
9  4   15 

我想這有attr_ids正好等於10,15,20 product_ids。如果我使用MySQL在

SELECT DISTINCT(產品)FROM tbl_product_rel WHERE attr_id IN (10,15,20)

,所以我得到同樣的product_id已attr_id等於15,但它確實沒有attr_ids 10和20.

任何想法?

+0

刪除不同的功能... – 2012-03-14 09:01:14

+0

這是正確的查詢。發佈你的結果請 – mkk 2012-03-14 09:01:55

+2

你不會得到他們,因爲他們共享相同的產品ids 1和3 – 2012-03-14 09:06:57

回答

4

您可以使用這樣的查詢,但我不知道這是不是最好的解決辦法:)

SELECT * FROM tbl_product_rel WHERE attr_id IN (10,15,20) GROUP BY product_id HAVING COUNT(product_id) = 3 
0

刪除獨特的功能:

SELECT product_id FROM tbl_product_rel WHERE attr_id IN (10,15,20)

1

這聽起來像你想只有具有全部三個屬性ID的產品ID。你可以用一些醜陋的子查詢做到這一點:

SELECT DISTINCT(product_id) FROM tbl_product_rel 
    WHERE product_id IN 
    (SELECT product_id FROM tbl_product_rel WHERE attr_id=10) 
    AND product_id IN 
    (SELECT product_id FROM tbl_product_rel WHERE attr_id=15) 
    AND product_id IN 
    (SELECT product_id FROM tbl_product_rel WHERE attr_id=20) 

你也可以做一些醜陋的連接。

+0

你之間建議的這種「between」之間有什麼問題? o_O – rMX 2012-03-14 09:12:17

+0

如果我理解他正在尋找具有屬性10和15和20但不是10或15或20的ID。因此,我們需要一個查詢來確保它檢查每個值。之間將返回任何這些值。也有可能還有其他的價值觀,他在10到20之間沒有提到。 – Ilion 2012-03-14 09:18:30

2

您可能會因爲DISTINCT函數而得到您的查詢無效的印象。
想想你想要的輸出是什麼?你想要得到的所有的product_id其中attr_id是10,15或20。這意味着你需要以下ID:

id product_id attr_id 
1  1 OK   10 
2  1 OK   15 
3  1 OK   20 
4  2 NO   6 
5  2 NO   9 
6  3 OK   10 
7  3 OK   15 
8  3 OK   20 
9  4 OK   15 

所以如果沒有基本的查詢不同應該返回:

1, 1, 1, 3, 3, 3, 4 

如果你使用不同的,你將獲得獨特的ID:

1, 3, 4 

我相信這是你得到的。

有可能你想要「id」而不是「product_id」。

更新:

啊我現在可能是什麼問題。您期望獲得滿足所有3個條件的product_id。您不能使用IN,因爲IN會加入ID爲OR的ID。您所寫的查詢可以改寫爲:

`SELECT DISTINCT(product_id) FROM tbl_product_rel WHERE attr_id = 10 OR attr_id = 15 OR attr_id = 20`. 

如果您確定沒有重複項(即,2條記錄與attr_id = 20),您的解決方案將是

`SELECT product_id FROM tbl_product_rel WHERE attr_id IN (10, 15, 20) GROUP BY product_id HAVING count(*) = 3 

但如果你允許重複,在這種情況下,這將不起作用,例如:

id product_id attr_id 
1  1   10 
2  1   20 
3  1   20 

你會得到1,但你不應該」噸(根據你的需要)。如果你允許這樣的場景,請讓我知道。

相關問題