繁体   English   中英

查询多对多关系增加了难度

[英]Querying a many-to-many relationship with added difficulty

这是我的问题:我有两个通过联结表连接的表。 我在Apache服务器上使用MySQL和PHP(Yii2),但它只是我需要帮助的SQL。

| Objects     |    ObjectHasTag    |   Tag    |
|---------------------------------------------|
| - id        |    -object_id      |   -id    |
| - name      |    -tag_id         |   -tag   |

我需要创建一个查询,该查询返回带有多个标签标记的对象,而我的问题是,作为一种可公开访问的功能,该查询是否可以以合理的效率实现。

示例:查找所有带有标签“ tagone”,“ tagtwo”和“ tagthree”的对象。

我有一个可行的解决方案,那就是在Objects-table中有一个'tags'列,所有的标签名都用逗号分开。 这似乎不是“最佳实践”这种解决方案。

非常感谢你们能提供的任何帮助!

SQL相对简单:

SELECT *
FROM Objects o
WHERE 3 = (
    SELECT COUNT(DISTINCT t.id)
    FROM ObjectHasTag ot
    JOIN Tag t ON t.id=ot.tag_id
    WHERE o.id = ot.object_id
      AND t.tag IN ('tag1', 'tag2', 'tag3')
)

COUNT(DISTINCT t.id)ObjectHasTag连接到Tag ,在要搜索的列表上过滤Tag ,并计算不同标签的数量。 为了选择对象,必须列出IN列表中的所有三个项目。 例如,如果您知道ObjectHasTag不能包含重复标记,因为您在表上具有唯一索引或约束,则可以将COUNT(DISTINCT t.id)替换为COUNT(*)

o.id = ot.object_id条件将嵌套查询“连接”到从“ Objects表中选择的Objects

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM