[英]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.