2012-10-25 38 views
2

我有一個SQL查詢,像這樣:如何過濾來自複雜SQL查詢的結果?

SELECT `categories`.`partnumbersafe`, `filters`.`filtername`, `filters`.`filtervalue` 
FROM `products_categories` AS `categories` 
LEFT OUTER JOIN `products` AS `product` ON `categories`.`partnumbersafe` = `product`.`partnumbersafe` 
LEFT OUTER JOIN `products_filters` AS `filters` ON `categories`.`partnumbersafe` = `filters`.`partnumbersafe` 
WHERE `categories`.`categoryid` =4 
AND (`product`.`visibility` =1 OR `product`.`visibility` =2) 
AND `product`.`status` =1 

這給了我那裏有不同的過濾器的名字和filtervalues多個partnumbersafe條目(值相同)的結果。例如:

partnumbersafe filtername filtervalue 

123    brand  toyota 
123    model  F5 
123    type   business 
678    brand  toyota 
678    model  F6 

該查詢由PHP生成。我的PHP腳本中也有POST值,它們包含filterdata(品牌是toyota,型號是F6)。

如何過濾filtername/value對的這些結果?我寧願一個SQL查詢解決方案,而不是一個PHP解決方案,在那裏我可以查詢partnumbersafe品牌是豐田和模型是F6。所以它只會檢索上表中的partnumbersafe 123。

表products_filters保存上表所示的所有數據。

回答

1
SELECT 
    `categories`.`partnumbersafe` 
FROM 
    `products_categories` AS `categories` 
LEFT OUTER JOIN 
    `products`   AS `product` 
    ON `categories`.`partnumbersafe` = `product`.`partnumbersafe` 
LEFT OUTER JOIN 
    `products_filters` AS `filters` 
    ON `categories`.`partnumbersafe` = `filters`.`partnumbersafe` 
WHERE 
    `categories`.`categoryid` = 4 
AND (`product`.`visibility` =1 OR `product`.`visibility` =2) 
AND `product`.`status` =1 
AND 
(
    (`filters`.`filtername` = 'Brand' AND `filters`.`filtervalue` = 'Toyota') 
    OR 
    (`filters`.`filtername` = 'Model' AND `filters`.`filtervalue` = 'F6') 
) 
GROUP BY 
    `categories`.`partnumbersafe` 
HAVING 
    COUNT(*) = 2 

這是假設你只需要partnumbersafe沒有filtername/filtervalue對將永遠適用於同一partnumbersafe不止一次。

+0

此外,由於這些過濾器,你不需要'LEFT JOIN',你可以使用'INNER JOIN' - 任何沒有過濾器記錄的東西都將被'WHERE'子句排除...... – MatBailie

+0

Dems,如果我還需要每個查詢的filtername品牌價值,這是可能的嗎? –

+0

你能否在你的問題中舉一個例子? – MatBailie

2

你需要在這裏有多個條件。每個partnumbersafe的記錄數量等於您提供的條件數量。

SELECT partnumbersafe 
FROM... 
WHERE (filterName = 'Brand' AND filtervalue = 'toyota') 
     OR 
     (filterName = 'Model' AND filtervalue = 'F6') 
GROUP BY partnumbersafe 
HAVING COUNT(*) = 2 
+0

謝謝約翰,你能再詳細一點嗎?你的意思是從上面的查詢中整體選擇?或者將其添加到查詢中,如圖所示。在後一種情況下,不會有結果,因爲表中沒有包含兩個值的行,這些行分佈在多行中。 –

+0

基本上它是你需要的查詢。用你原來的'FROM'子句替換'FROM ...'。請確保在列上包含表名或別名以避免模糊性錯誤。 –

+1

@MarcBuurke - 這和我的答案一樣。它首先找到具有「品牌」,「豐田」***或***「型號」,「F6」的行。然後按照「PartNumberSafe」值進行分組,但僅***返回組中具有2個源行的結果。這意味着你現在有一個'PartNumberSafe'的列表,它有一個'品牌','豐田'行***和***'型號','F6'行... – MatBailie