【发布时间】:2020-03-09 07:13:30
【问题描述】:
我有一个包含具有以下结构的属性的表:
id: bigint unsigned autoincrement
product_id: bigint foreign key
attribute_id: bigint foreign key
value: varchar(100)
我可以通过以下方式查询一个条件:
SELECT DISTINCT product_id FROM product_attributes WHERE attribute_id = ? AND value = ?
但是,我需要能够找到符合多个此类条件的产品,并且出于性能原因希望避免多个数据库查询。简单地使用 AND 添加更多条件是行不通的,因为它们将涉及相同的列,例如:
SELECT DISTINCT product_id FROM product_attributes WHERE attribute_id = 1 AND value = 'Blue'
INTERSECT
SELECT DISTINCT product_id FROM product_attributes WHERE attribute_id = 2 AND value = '36'
INTERSECT
SELECT DISTINCT product_id FROM product_attributes WHERE attribute_id = 3 AND value = 'slim'
我已经阅读了 INTERSECT 语句,它似乎可以工作,但我读到 MySQL 不支持它,通过 MySQL 8 文档搜索没有产生相关结果,并且我认为上面的查询是正确的产生了MySQL 错误。
我还了解到,使用内部连接也可以实现类似的功能,但我发现的所有示例都涉及多个表。可能还有一种更好或更简单的方法来编写我没有想到的查询。或者,实际上最好只发送多个查询并在 MySQL 之外计算交集(尽管我会感到非常惊讶)我非常感谢过去做过类似事情的任何人的帮助。
【问题讨论】:
-
你听说过
OR运营商吗?或者你只是在使用AND -
@Zeljka 要是这么简单就好了。使用 OR 运算符会产生误报。我会得到符合任何标准的产品。因此,例如,我会得到不是蓝色但纤细或尺寸为 36 的产品。或者我可能会得到蓝色但不纤细且尺寸不是 36 的产品。
-
好的,您没有使用
OR运算符,试试thiswhere (attribute_id = 1 AND value = 'Blue') OR (attribute_id = 2 AND value = '36') OR (attribute_id = 3 AND value = 'slim')并且不要使用任何相交,只需一个符合此条件的查询 -
EAV 模式设计充满了麻烦。慰问。
-
这是一个常见问题解答。在考虑发布之前,请阅读手册和谷歌任何错误消息或您的问题/问题/目标的许多清晰、简洁和精确的措辞,有和没有您的特定字符串/名称和站点:stackoverflow.com 和标签;阅读许多答案。如果您发布问题,请使用一个短语作为标题。请参阅How to Ask 和投票箭头鼠标悬停文本。 PS您的帖子不包含您正在谈论的查询类别的清晰准确的陈述。在你这样做之前,你无法有效地搜索。您还希望我们从片段和示例中猜测。
标签: mysql inner-join key-value entity-attribute-value intersect