MySQL查询,多对多关系的交集

标签 mysql many-to-many join intersection

有人有如何实现这一目标的好主意/解决方案吗?

情况是: 我有表“releases”和“ntags”, 通过“releases_ntags”相关(包含“release_id”和“ntag_id”)

我想通过 ntag 的“slug”获取发布结果。

我设法让这个半工作:

sql

SELECT r.id, r.name
FROM releases r
LEFT JOIN ntags_releases rt ON rt.release_id = r.id
JOIN ntags nt ON nt.id = rt.ntag_id
AND (nt.name = ('TAG_1') OR nt.name = ('TAG_2'))
GROUP BY r.id, r.name

到目前为止一切顺利,但这给了我所有带有“TAG_1”的版本加上所有带有“TAG_2”的版本(当然还有带有两个标签的版本)。

但我需要的是只获取标签的交集,例如:

“使用“TAG_1”“TAG_2”发布”

所以我尝试了:

...
AND (nt.name = ('TAG_1') AND nt.name = ('TAG_2'))
... 

但这会导致空结果。 有谁知道如何实现这一目标?不知道如何进一步解决这个问题,非常感谢一些意见!

谢谢

最佳答案

您可以要求 having 子句中存在两个不同的 ntag:

SELECT  r.id, r.name
FROM    releases r
JOIN    ntags_releases rt
ON      rt.release_id = r.id
JOIN    ntags nt
ON      nt.id = rt.ntag_id
WHERE   nt.name in ('TAG_1', 'TAG_2')
GROUP BY
        r.id, r.name
HAVING
        COUNT(distinct nt.name) = 2

关于MySQL查询,多对多关系的交集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3882123/

相关文章:

mysql - Laravel 5.8 多对多关系使用数据透视表的自定义列名称

mysql - 将 MySQL 表与其自身连接

php - 消除数据库查询中的字段索引

MySQL BETWEEN 未按预期工作

mysql - JPA,已经持久化的对象给出 "a new object was found through a relationship that was not marked cascade PERSIST"

JOIN 后 MySQL SUM 无法正常工作

sql - 如何在维护小结果集的同时从 SQL 填充对象的列表属性?

python - 在 SQL 查询中使用 Python 列表获取列名

php - Laravel 使用模型连接两个数据库表

php - Laravel 5.5 更新多对多关系模型的复选框