2

私は次のような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

これにより、フィルター名とフィルター値が異なる複数のpartnumbersafeエントリ(同じ値)があるという結果が得られます。例えば:

partnumbersafe   filtername   filtervalue

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

クエリはPHPによって生成されます。PHPスクリプトにfilterdataを保持するPOST値もあります(ブランドはトヨタ、モデルはF6など)。

これらの結果をfiltername/valueのペアでフィルタリングするにはどうすればよいですか?phpソリューションではなくsqlクエリソリューションを使用します。このソリューションでは、ブランドがトヨタでモデルがF6のpartnumbersafeをクエリできます。上記の表のpartnumbersafe123のみを取得するようにします。

テーブルproducts_filtersは、上記のテーブルの概要で表されているすべてのデータを保持します。

4

2 に答える 2

2

ここでは複数の条件が必要です。それぞれのレコード数はpartnumbersafe、指定した条件の数と同じです。

SELECT partnumbersafe
FROM...
WHERE (filterName = 'Brand' AND filtervalue = 'toyota')
        OR
      (filterName = 'Model' AND filtervalue = 'F6')
GROUP BY partnumbersafe
HAVING COUNT(*) = 2
于 2012-10-25T14:41:07.670 に答える
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 filternamefiltervaluepartnumbersafeます。

于 2012-10-25T14:41:40.117 に答える