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

时间:2010-10-07 13:31:48

标签: mysql many-to-many join intersection

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

情况是: 我有表'release'和'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” PLUS 所有版本都带有“TAG_2”(当然那些带有两个标签的版本)。

但我需要的是只获得标签的交集,比如说:

“发布'TAG_1' AND 'TAG_2'”

所以我尝试了:

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

但这会导致空洞的结果。 有谁知道如何实现这一目标?不知道如何更进一步,并且非常感谢一些意见!

THX

1 个答案:

答案 0 :(得分:1)

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

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