2011-10-10 53 views
3

我有三个表格:posts,tags和posts_has_tags(它们促进了帖子和标签之间的多对多关系)。帖子可以有任意数量的标签。排除具有多对多关系的行

'信息' 表中有以下栏目: idposts 文本

的 '标签' 表中有这些: idtags 名

至于 'posts_has_tags' 表: posts_idposts tags_idtags

我不能做的是提出一个查询来选择所有帖子,除了那些在'name'列中有一个标签(或多个标签)的标签米它似乎应该包含一个“不存在”,但我不能完全包围它。

非常感谢您的帮助。

编辑:

此外,是否有可能限制结果在同一时间设置为特定的标签?例如:

标签为排除:A,B 标签包括:C

邮政与标签“一”,“F”并不能使它成为结果集(因为如果它的标签包括在无)。 带有标签'a','b','c'的帖子也不会将其放入结果集中(因为它的'a'和'b'是排除的标签)。 带有标签'c','f'的帖子会将它变成结果集,因为'c'是包含的标签。

最后编辑 我终于发现,似乎是工作,合理性能良好的解决方案:http://www.mysqldiary.com/a-many-to-many-relationship-table-solving-the-exclude-relation-problem/

+0

不清晰(编辑部分),请你以更好的方式解释它(重定向?)。 – punit

回答

3
SELECT p.* 
FROM posts AS p 
WHERE NOT EXISTS 
     (SELECT * 
     FROM posts_has_tags AS pt 
      JOIN tags AS t 
      ON pt.tags_idtags = t.idtags 
     WHERE pt.posts_idposts = p.idposts 
      AND t.name = @CertainForbiddenTagName 
    ) 

如果你有很多标签名称禁止,而是使用这样的:

  AND t.name IN (List of ForbiddenTagNames) 

对于您更新的第二个问题,只需添加一个类似的EXISTS

AND EXISTS 
     (SELECT * 
     ... 
     ) 
+0

谢谢!你还可以看看我编辑中描述的问题吗? – sbichenko

+0

是否可以优先使用该查询进行排除? – sbichenko

4

您可以使用反连接。

SELECT p.* 
FROM posts p 
LEFT JOIN post_has_tags pt ON (pt.post_id = p.id) 
LEFT JOIN tags t ON (t.id = pt.tag_id AND t.name IN ('test','test1','test2')) 
WHERE t.id IS NULL 
GROUP BY p.id 

如果要强制包含其他标记,则需要进行另一个连接。

SELECT p.* 
FROM posts p 
LEFT JOIN post_has_tags pt ON (pt.post_id = p.id) 
LEFT JOIN tags t ON (t.id = pt.tag_id AND t.name IN ('a','b')) 
INNER JOIN tags t2 ON (t2.id <> t.id AND t2.id = pt.tag_id AND t2.name IN ('c')) 
WHERE t.id IS NULL 
GROUP BY p.id 

这将优先排除包含。
如果要优先列入然后更换内部联接用:

INNER JOIN tags t2 ON (t2.id = pt.tag_id AND t2.name IN ('c')) 
+1

你不需要'GROUP BY p.id'吗? –

+1

@ypercube,是的,你需要一个'SELECT DISTINCT'或更快的替代'GROUP BY p.id' – Johan

+0

谢谢!你还可以看看我编辑中描述的问题吗? – sbichenko

0
select * from posts where idposts in 
(select posts_has_tags.posts_idposts from posts_has_tags 
join tags on tags.idtags = posts_has_tags.tags_idtags 
where tags.name not in ('value1','value2',...)) 
+0

谢谢!你还可以看看我编辑中描述的问题吗? – sbichenko