作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我的 MySQL 数据库中有一个多对多关系,其中包含三个表,如下所示:
表项,TABLE关系(仅存储项目和标签的id),表格标签
每个项目可以有多个标签,标签也可以与多个项目相关,例如项目“鞋子”可以具有标签“运动”和“皮革”,而标签“运动”可以与项目“鞋子”和“衬衫”相关。
我现在需要做的是选择所有具有一个或多个由 AND 条件组合的标签的项目,例如我想查找所有带有“运动”标签和“皮革”相关标签的商品。
是否可以仅使用一个查询通过 AND 条件检索请求的数据,或者我是否需要构建子查询(或类似的东西)?
另一种方法是获取带有与 OR 组合的标签的所有项目,如下所示:
SELECT *
FROM item
LEFT JOIN relation
ON item.id = item_id
LEFT JOIN tag
ON tag.id = tag_id
WHERE (tag = 'sport' OR tag = 'leather')
GROUP BY item.id;
然后过滤掉那些没有所有必要标签的标签,但我宁愿让数据库来完成这项工作,而不是获取不必要的项目然后进行迭代。
最佳答案
您可以稍微改变当前的查询以获得您想要的结果:
SELECT i.id, i.name -- OK to select name assuming id is the PK
FROM item i
LEFT JOIN relation r
ON i.id = r.item_id
LEFT JOIN tag t
ON t.id = r.tag_id
WHERE t.tag IN ('sport', 'leather')
GROUP BY i.id
HAVING COUNT(DISTINCT t.tag) = 2;
这将返回所有同时具有 sport
和 leather
标签的商品。它的工作原理是按项目聚合(就像您已经在做的那样),然后在 HAVING
子句中断言有两个不同的匹配标签。由于我们在 WHERE
子句中仅限制这两个标记,因此如果聚合后 HAVING
检查通过,则意味着该项目是匹配的。
关于MySQL:具有多个 AND 条件的多对多关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52290036/
我是一名优秀的程序员,十分优秀!