Mysql 查询多对多关系增加了难度
我的问题是: 我有两张桌子通过一张连接桌连接起来。 我在Apache服务器上使用MySQL和PHP(Yii2),但这正是我需要帮助的SQLMysql 查询多对多关系增加了难度,mysql,sql,Mysql,Sql,我的问题是: 我有两张桌子通过一张连接桌连接起来。 我在Apache服务器上使用MySQL和PHP(Yii2),但这正是我需要帮助的SQL | Objects | ObjectHasTag | Tag | |---------------------------------------------| | - id | -object_id | -id | | - name | -tag_id |
| Objects | ObjectHasTag | Tag |
|---------------------------------------------|
| - id | -object_id | -id |
| - name | -tag_id | -tag |
我需要创建一个查询,返回带有多个标记的对象,我的问题是,作为一个公共可访问的查询功能,这是否可以以合理的效率实现
示例:查找标记为“tagone”、“tagtwo”和“tagthree”的所有对象
我有一个可行的解决方案,那就是在Objects表中有一个“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
,并统计不同标记的数量。要选择对象,必须显示中列表中的所有三项。例如,如果您知道ObjectHasTag
不能包含重复的标记,因为您在表上有一个唯一的索引或约束,那么可以将COUNT(DISTINCT t.id)
替换为COUNT(*)
o.id=ot.object\u id
条件将嵌套查询“连接”到从Objects
表中选择的对象。谢谢!这太完美了。我甚至不知道从哪里开始SQL查询。dasblinkenlight提供了一个完美的解决方案。