2011-10-10 22 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