产品过滤查询

时间:2015-03-12 12:22:53

标签: php mysql

我们已经实施了一个购物车,其中有各种过滤器,如颜色,大小等。

目前我们使用单桌用于产品和他们的过滤器,所以每当需要获取产品时,我们都会使用下面提到的查询:

SELECT * FROM products WHERE (color='red' OR color='yellow') AND size=s

现在,在我们的数据库中,1500000行和20个过滤器在产品表中创建了大约90列,因为此产品表太重了。因此,我们更改了数据库结构并创建了用于管理产品过滤器关系的新表。

我们正在为新数据库的样本提供sql file,我们需要获取颜色=红色,黄色和黄色的产品。大小= S

下面提到的查询已经用于查找具有红色或黄色显示的产品,但是如果我们使用其他选项组(大小),那么我们需要这样的查询(options.OptionName ='red'或options.OptionName ='yellow ')和options.OptionName ='s',它们将0行作为不同行中的选项组值。

SELECT products.ProductID,options.* FROM Products
INNER JOIN productoptions on Products.ProductID = productoptions.ProductID
INNER JOIN options ON options.OptionID = productoptions.OptionID
WHERE options.OptionName = 'red' OR options.OptionName = 'yellow'

请建议

1 个答案:

答案 0 :(得分:0)

您可以按属性(例如:颜色,大小等)过滤子集,并将这些子集的交集:

SELECT 
    *
FROM 
    products
INNER JOIN 
    (
        SELECT 
            productoptions.ProductID,
            OptionName
        FROM
            productoptions
        INNER JOIN
            options
        ON
            productoptions.OptionID = options.OptionID
        WHERE
            options.OptionName = 'red' OR options.OptionName = 'blue'
    ) as OptGroup1
ON
    OptGroup1.ProductID = products.ProductID

INNER JOIN 
    (
        SELECT 
            productoptions.ProductID,
            OptionName
        FROM
            productoptions
        INNER JOIN
            options
        ON
            productoptions.OptionID = options.OptionID
        WHERE
            options.OptionName = 'M'
    ) as OptGroup2
ON
    OptGroup2.ProductID = products.ProductID

我有另一种肮脏的解决方案,但它不是最佳的:在您可以过滤后将产品属性转换为一个字段,例如 LIKE

SELECT 
    products.ProductId, 
    options.*,
    GROUP_CONCAT(CONCAT_WS('-',options.OptionGroupID, options.OptionName)) as properies
FROM 
    products
INNER JOIN 
    productoptions on products.ProductID = productoptions.ProductID
INNER JOIN 
    options ON options.OptionID = productoptions.OptionID
GROUP BY
    ProductId
HAVING 
    (properies LIKE '%1-red%' OR properies = '%1-yellow%') AND properies LIKE '%2-S%';

PS:但我认为最好的解决方案是如果您引入搜索服务器,例如:Apache Solr