我有以下数据库结构来存储产品选项。
现在我有问题要过滤掉只匹配给定选项的产品。首先我做了 WHERE option_id IN(选项数组),但这会给我提供与任何选项匹配的产品,这不是解决方案。例如,用户只想过滤出具有给定材料、颜色和尺寸的产品。如果我做 WHERE option_id = 4 AND option_id = 6 例如我什么也得不到。
这是我的查询:
SELECT DISTINCT p.id AS id,
...
FROM products p
LEFT JOIN product_categories pc ON p.id = pc.product_id
LEFT JOIN product_images pi ON p.id = pi.product_id
LEFT JOIN product_options po ON p.id = po.product_id
WHERE p.product_active = 1
AND po.option_id = 1 // only to get the idea
GROUP BY id
ORDER BY id DESC
LIMIT 0,
12
只是提一下它是 PHP 应用程序,用户从带有或不带有多个属性的 select 元素中选择选项。
如何实现这一点?
您可以使用having
:
SELECT p.id AS id, ...
FROM products p JOIN
product_categories pc
ON p.id = pc.product_id LEFT JOIN
product_images pi
ON p.id = pi.product_id JOIN
product_options po
ON p.id = po.product_id
WHERE p.product_active = 1 AND
po.option_id IN (4, 6)
GROUP BY p.id
HAVING COUNT(DISTINCT po.option_id) = 2
ORDER BY p.id DESC
LIMIT 0, 12;
该HAVING
子句指定给定id
有两个匹配选项。由于该WHERE
条款,这些是您唯一关心的两个选项。
我没有改变您的方法(您没有提供完整的查询),但是您正在按照不同的维度进行连接——类别、图像和选项。这会为每个产品创建一个笛卡尔积,这通常不是此类查询的最佳方法。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句