我们已经实施了一个购物车,其中有各种过滤器,如颜色,大小等。
目前我们使用单桌用于产品和他们的过滤器,所以每当需要获取产品时,我们都会使用下面提到的查询:
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'
请建议
答案 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