2010-07-26 61 views
1

我在提取某些數據時遇到問題。
的表我有(用於測試目的):搜索具有多個條件的產品

產品:

 
product_id  | product_name 
----------------------------- 
1    | product 1 
2    | product 2 
3    | product 3 

屬性:

 
product_id  | attribute_id  | attribute_value 
------------------------------------------------------- 
1    | 1     | lorem 
1    | 2     | ipsum 
2    | 1     | lorem 
2    | 2     | doler 
3    | 1     | sit 
3    | 2     | ipsum 

我想找到具有存儲在attribute_id 1 LOREM和存有存儲產品在屬性_id 2中。

如果我使用此查詢,

 
SELECT 
    attributes.attribute_id, 
    attributes.attribute_value, 
    products.product_id 
FROM 
    products 
    Inner Join attributes ON products.product_id = attributes.product_id 
WHERE 
    (attributes.attribute_id = 1 AND attributes.attribute_value = 'lorem') 
OR 
    (attributes.attribute_id = 2 AND attributes.attribute_value = 'ipsum') 

我得到:

 
attribute_id   | attribute_value  | product_id 
---------------------------------------------------------- 
1     | lorem    | 1 
2     | ipsum    | 1 
1     | lorem    | 2 
2     | lorem    | 3 

但我真的希望得到這樣的結果:

 
attribute_id_1 | attribute_id_2 | attribute_value_1 | attribute_value_2 | product_id 
---------------------------------------------------------- 
1    | 2    | lorem    | ipsum    | 1 

或者只是PRODUCT_ID 1的結果。

我可以讓它與下一個查詢一起工作,但在生產中(有大量的數據和更多的連接),這是慢的方法。

 
SELECT 
    products.product_id 
FROM 
    products 
    Inner Join attributes ON products.product_id = attributes.product_id 
WHERE 
    attributes.attribute_value = 'ipsum' 
AND 
    products.product_id IN (
     SELECT 
     products.product_id 
     FROM 
     products 
     Inner Join attributes ON products.product_id = attributes.product_id 
     WHERE 
     attributes.attribute_value = 'lorem' 
) 

我希望你明白我在做什麼。

有人可以幫我嗎?
謝謝!

回答

0

你可以把第一個(損壞)查詢,組product_id,然後添加HAVING COUNT(*) = 2子句?

+0

這可能工作..如果Brian的回答不起作用,我會試試這個。謝謝! – Johan 2010-07-26 11:20:29

+0

沒問題:)祝你好運... – pdbartlett 2010-07-26 11:24:13

+0

嗯,因爲我的生產設置比我的例子稍微複雜一點,所以你的答案是有效的,對我來說是最好的選擇。再次感謝。 – Johan 2010-07-26 11:54:35

0

報價:

attribute_id_1 | attribute_id_2 | attribute_value_1 | attribute_value_2 | product_id 
---------------------------------------------------------- 
1    | 2    | lorem    | ipsum    | 1 

我想你不能創建動態字段..我不明白你爲什麼會取你的數據呀? 你爲什麼不只是這樣做:

select Products.* from Products,Attributes WHERE 
Products.product_id = Attributes.product_id 
AND ((Attributes.attribute_value='ipsum' AND Attributes.attribute_id='1') OR (Attributes.attribute_value='lorem' AND Attributes.attribute_id='2')) GROUP by Products.product_id; 
+0

我需要找到lorem存儲在attribute_id 1和ipsum存儲在attribute_id 2中的產品,而不是像我的示例中那樣。有了這個查詢,我可以得到他們。但謝謝你的回覆。 – Johan 2010-07-26 11:19:33

+0

然後使用'QUERY 1'UNION'QUERY 2' 查看UNION上的MySQL文檔。 – Youssef 2010-07-26 11:56:50

0
SELECT * FROM products p 
INNER JOIN attributes a USING (product_id) 
WHERE a.attribute_value IN ('lorem','ipsum') 
+0

這樣我就可以得到所有的產品,而不是兩個值。 – Johan 2010-07-26 11:21:55

0

由於前四列都是固定的,就沒有必要選擇。所有你需要的是產品ID;你可以得到這個由...

SELECT product_id 
    FROM products 
    WHERE EXISTS (SELECT * 
         FROM attributes 
         WHERE attributes.product_id  = products.product_id AND 
          attributes.attribute_id = 1     AND 
          attributes.attribute_value = 'lorem') 
        AND 
      EXISTS (SELECT * 
         FROM attributes 
         WHERE attributes.product_id  = products.product_id AND 
          attributes.attribute_id = 2     AND 
          attributes.attribute_value = 'ipsum'); 

如果你真的必須在你輸出的固定欄目,你可以嘗試...

SELECT 1 AS attribute_id_1, 
     2 AS attribute_id_2, 
     'lorem' AS attribute_value_1, 
     'ipsum' AS attribute_value_2, 
     product_id 
    FROM ...etc... 
+0

嘿,布賴恩,我認爲這將起作用......我將嘗試在我的生產數據庫中使用它。謝謝! – Johan 2010-07-26 11:18:01

+0

這個答案對我上面的例子來說是完美的,但是我無法在我的生產環境中使用它。但再次感謝。 – Johan 2010-07-26 11:56:06

0
Select 
a1.attribute_id attribute_id_1, 
a2.attribute_id attribute_id_2, 
a1.attribute_value attribute_value_1, 
a2.attribute_value attribute_value_2, 
p.product_id 
from products p 
inner join attributes a1 on a1.product_id = p.product_id and a1.attribute_id = 1 
inner join attributes a2 on a2.product_id = p.product_id and a2.attribute_id = 2 
where a1.attribute_value='lorem' 
and a2.attribute_value='ipsum';