【发布时间】:2020-01-01 06:35:45
【问题描述】:
我有三个具有多对多关系的表; media、relations 和 tags
Media Table Relations Table Tags Table
| media-id | media-name | | rel-id | media-id | tag-id | | tag-id | tag-name|
------------------------- ------------------------------ --------------------
| 1 | "Media 1" | | 1 | 1 | 1 | | 1 | "tag 1" |
| 2 | "Media 2" | | 2 | 2 | 2 | | 2 | "tag 2" |
| 3 | 1 | 3 | | 3 | "tag 3" |
| 4 | 2 | 3 | | 4 | "tag 4" |
| 5 | 1 | 4 |
我需要一个 MySQL 查询,当给出一个或多个标签时,它将返回所有其他可能的标签组合。这里有几个例子。
示例 1
鉴于: tag 1
返回: tag 1、tag 3 和 tag 4
因为: tag 1 正在标记 Media 1,因此它应该返回其所有标记(tag 1、tag 3 和 tag 4)
示例 2
鉴于: tag 3
返回:返回tag 1、tag 2、tag 3和tag 4
因为: tag 3 同时标记了Media 1 和Media 2,所以它们的所有标记都会返回(tag 1、tag 2、tag 3、tag 4)
示例 3
给定: tag 2 和 tag 3
返回: tag 2 和 tag 3
因为: tag 3 标签 两个 Media 1 和 Media 2,但只有 Media 2 有 tag 2,所以只是返回它的标签和 @987654355 @的标签被排除在外
我已经搜索了一段时间,但我没有找到任何与弧形答案相关的东西。我能得到的最接近的是这里的查询:
SELECT `tags`.`tag-name`
FROM `tags`
WHERE `tags`.`tag-id` IN (
SELECT `relations`.`tag-id`
FROM `relations`
WHERE `relations`.`media-id` IN (
SELECT `relations`.`media-id`
FROM `relations`
WHERE `relations`.`tag-id` IN (
SELECT `tags`.`id`
FROM `tags`
WHERE `tags`.`tag-name` IN ('tag 1')
)
)
)
这很好用,也许不是最有效的,但我能理解。
唯一的问题是如果我在示例 3 上运行它,它将返回所有标签,而不是从 Media 1 中排除标签。
有没有办法改变我的 MySQL 查询来做到这一点?
【问题讨论】:
-
“媒体 1”也未使用“标签 4”进行标记。你的问题没有意义。
-
@GordonLinoff,对不起,我是按表格编辑的