2013-12-22 79 views
2

我在構建以下方案的查詢時沒有使用多個子查詢時遇到問題。Mysql查詢以檢索通過sveral過濾器(屬性)分類的產品

產品是由喜歡的顏色,大小等一些過濾器分類..顏色是一個過濾器組,包含過濾器,其是實際的顏色:綠色,紅色,藍色,..

見圖片: http://s27.postimg.org/9zjvj2dur/mysql_stack2.jpg


就像它寫在圖像上,是否有可能檢索出例如藍色或綠色的產品和L的大小,而不使用子查詢?

我想出什麼樣的主意是每個濾波器組子查詢,但似乎非常低效:

SELECT * FROM myTable 
# colors subquery 
WHERE productid IN (SELECT productid FROM myTable 
     WHERE filterid = 1 OR filterid = 2) 
# sizes subquery 
AND productid IN (SELECT productid FROM myTable 
     WHERE filterid = 3); 

(filterid都有一個唯一的ID號)

+0

請給例如數據你的問題與期望的輸出一起。圖像沒有意義(例如,列名中的值是什麼意思?)。 –

+0

圖像已被另一個替換。彩色提示應該解釋現在值的含義。 – nod

+0

將來請以文本形式發佈樣本數據。圖片是偉大的,但不可能合作。更好的是,創建一個[sqlfiddle](http://sqlfiddle.com) – peterm

回答

2

你能做到這樣

SELECT productid 
    FROM table1 
WHERE filterid IN(1, 2, 3) 
GROUP BY productid 
HAVING MAX(filterid IN(1, 2)) = 1 
    AND MAX(filterid = 3) = 1 

示例輸出:

 
| PRODUCTID | 
|-----------| 
|   2 | 

如果需要返回對此類產品的所有列則剛剛加入回你的表

SELECT * 
    FROM 
(
    SELECT productid 
    FROM table1 
    WHERE filterid IN(1, 2, 3) 
    GROUP BY productid 
    HAVING MAX(filterid IN(1, 2)) = 1 
    AND MAX(filterid = 3) = 1 
) q JOIN table1 p 
    ON q.productid = p.productid; 

輸出示例:

 
| PRODUCTID | FILTERGROUPID | FILTERID | 
|-----------|---------------|----------| 
|   2 |    1 |  2 | 
|   2 |    2 |  3 | 
|   2 |    3 |  6 | 

這裏是SQLFiddle演示

+0

感謝您的全面迴應。我會在早上檢查查詢。我不太確定這個查詢是如何工作的,因爲我從來沒有用過這種方法,但是要分析一切。 – nod

+0

不客氣。慢慢來嘗試一下。現在談談它是如何工作的。我們用'productid'進行分組,並且對於每個組我們檢查一個組內的任何行是否有'filtered = 1'。如果這是真的,那麼MySQL中的這個布爾表達式將返回1(真),然後我們使用MAX()函數來過濾產品ID。 – peterm