Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 查询多对多关系增加了难度_Mysql_Sql - Fatal编程技术网

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

Mysql 查询多对多关系增加了难度,mysql,sql,Mysql,Sql,我的问题是: 我有两张桌子通过一张连接桌连接起来。 我在Apache服务器上使用MySQL和PHP(Yii2),但这正是我需要帮助的SQL | Objects | ObjectHasTag | Tag | |---------------------------------------------| | - id | -object_id | -id | | - name | -tag_id |

我的问题是: 我有两张桌子通过一张连接桌连接起来。 我在Apache服务器上使用MySQL和PHP(Yii2),但这正是我需要帮助的SQL

| 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提供了一个完美的解决方案。