2013-05-11 26 views
0

我在做產品過濾器點是用戶選擇產品越具體,應該出現的結果越少。在此刻,我寫了多個查詢並存儲在數組中並檢查數組相交,但結果相反,這意味着當用戶應用更多的過濾器時,我將顯示更多的產品。Mysql SELECT其中2列匹配值的集合

所以我想可能有一個SQL命令,我不知道!

簡單的例子:

------------ 
table "filter" 
------------ 
product 
Spec 
value 


------------ 
Sample data 
------------ 

book1,page,200 
book1,cover,leather 
book1,language,en 

book2,page,300 
book2,cover,paper 
book2,language,de 

book3,page,150 
book3,cover,hard 
book3,language,en 



SELECT `product` FROM `filter` where ... 

我該如何選擇(頁= 200和語言特點= EN)?

+0

顯示您嘗試過的代碼。 – Olexa 2013-05-11 04:36:45

+0

所以你使用你喜歡的SQL數據庫作爲一個簡單的鍵:價值存儲? – 2013-05-11 04:38:11

+0

foreach($ a as $ k => $ v){sql1 =「SELECT * FROM'spec_product' WHERE'spec_pin' ='$ k'AND LOWER('value')= LOWER('$ v')」 ; $ res2 = mysqli_query($ mysqli,$ sql2); ($ newArray2 = mysqli_fetch_array($ res2,MYSQLI_ASSOC)){ $ product_pin = $ newArray2 [「product_pin」];如果($ res2){ while($ newArray2 = mysqli_fetch_array($ res2,MYSQLI_ASSOC)){ ($ in_array($ product_pin,$ sp)){ array_push($ sp,$ product_pin); } } } } $ r = array_intersect($ sp,$ p); – AK4668 2013-05-11 04:38:28

回答

3

如果理解正確的話,你可能正在這樣的事情

SELECT product 
    FROM filter 
WHERE (spec = 'page' AND value = '200') 
    OR (spec = 'language' AND value = 'en') 
GROUP BY product 
HAVING COUNT(*) = 2 -- 2 here represents number of spec-value pairs 

輸出:

| PRODUCT | 
----------- 
| book1 | 

SQLFiddle

+0

不,他希望產品名稱在哪裏page = 200 **和** langauge = en – hims056 2013-05-11 04:39:19

+1

@ hims056感謝您的澄清。更新了答案 – peterm 2013-05-11 04:43:00

+0

是的,現在是正確的。 +1 – hims056 2013-05-11 04:43:21

1

另一種選擇,但不太優雅。我只是想展示另一種做法。

SELECT DISTINCT product 
FROM filter f 
WHERE 
    EXISTS (SELECT 1 FROM filter WHERE spec = 'language' AND value = 'en' AND product = f.product) 
    AND EXISTS (SELECT 1 FROM filter WHERE spec = 'page' AND value = 200 AND product = f.product);