Select 多个属性的产品,使用 AND 代替 OR 连接符,数据模型 EAV
Select products by multiple attributes, using AND instead OR concatenator, Data model EAV
我在查询电子商务网站产品过滤器时遇到问题。
我有这样的 EAV 数据模型:
products [id, title....]
attributes [id, name]
attributes_entity [product_id, attribute_id, value_id]
attributes_values [id, value]
我的查询:
SELECT
products.id,
products.title
FROM
products
WHERE products.id IN
(
SELECT attributes_entity.product_id FROM attributes_entity INNER JOIN
attributes ON attributes_entity.attribute_id=attributes.id INNER JOIN
attributes_values ON attributes_entity.value_id=attributes_values.id
WHERE
(
(attributes.name="Memory" AND attributes_values.value="16GB")
>> AND
(attributes.name="Color" AND attributes_values.value="Gold")
)
)
AND products.category_id = :category_id
问题是当我使用 >> AND between (attributes.name="Memory" AND attributes_values.value="16GB") 子查询时我得到 0 个结果但是当我使用 OR 它给了我更多我需要的结果,这些结果与这 2 个条件无关。
例如,当我收到请求时:"Memory = 16GB and Color = Black"。我希望得到 iPhone 5 16BG 黑色,而不是全部(金色,space 灰色等)iPhones with 16GB
我正在寻找查询示例,最好有其工作原理的描述。
此致,
安东
你的子查询应该是这样的:
SELECT
attributes_entity.product_id
FROM
attributes_entity INNER JOIN attributes
ON attributes_entity.attribute_id=attributes.id
INNER JOIN attributes_values ON
attributes_entity.value_id=attributes_values.id
WHERE
(attributes.name="Memory" AND attributes_values.value="16GB")
OR
(attributes.name="Color" AND attributes_values.value="Gold")
GROUP BY
attributes_entity.product_id
HAVING
COUNT(DISTINCT attributes.name)=2
此解决方案使用 GROUP BY 子查询。您必须使用 OR,因为该属性不能在同一行上同时为 Memory 和 Color,它们可以同时为真但在不同的行上。 COUNT(DISTINCT attributes.name) 计算 Color 或 Memory 属性的数量,如果为 2,则至少有 1 行第一个条件为真,1 行另一个条件也为真。
我在查询电子商务网站产品过滤器时遇到问题。
我有这样的 EAV 数据模型:
products [id, title....]
attributes [id, name]
attributes_entity [product_id, attribute_id, value_id]
attributes_values [id, value]
我的查询:
SELECT
products.id,
products.title
FROM
products
WHERE products.id IN
(
SELECT attributes_entity.product_id FROM attributes_entity INNER JOIN
attributes ON attributes_entity.attribute_id=attributes.id INNER JOIN
attributes_values ON attributes_entity.value_id=attributes_values.id
WHERE
(
(attributes.name="Memory" AND attributes_values.value="16GB")
>> AND
(attributes.name="Color" AND attributes_values.value="Gold")
)
)
AND products.category_id = :category_id
问题是当我使用 >> AND between (attributes.name="Memory" AND attributes_values.value="16GB") 子查询时我得到 0 个结果但是当我使用 OR 它给了我更多我需要的结果,这些结果与这 2 个条件无关。
例如,当我收到请求时:"Memory = 16GB and Color = Black"。我希望得到 iPhone 5 16BG 黑色,而不是全部(金色,space 灰色等)iPhones with 16GB
我正在寻找查询示例,最好有其工作原理的描述。
此致, 安东
你的子查询应该是这样的:
SELECT
attributes_entity.product_id
FROM
attributes_entity INNER JOIN attributes
ON attributes_entity.attribute_id=attributes.id
INNER JOIN attributes_values ON
attributes_entity.value_id=attributes_values.id
WHERE
(attributes.name="Memory" AND attributes_values.value="16GB")
OR
(attributes.name="Color" AND attributes_values.value="Gold")
GROUP BY
attributes_entity.product_id
HAVING
COUNT(DISTINCT attributes.name)=2
此解决方案使用 GROUP BY 子查询。您必须使用 OR,因为该属性不能在同一行上同时为 Memory 和 Color,它们可以同时为真但在不同的行上。 COUNT(DISTINCT attributes.name) 计算 Color 或 Memory 属性的数量,如果为 2,则至少有 1 行第一个条件为真,1 行另一个条件也为真。