2013-08-17 105 views
0

我正在构建一个非常简单的cms。
在它的两个对象为文章标签 这里是DB模式,我有当前:构造包含映射表的查询?

The scheema ERD

使用这个我可以通过标签的文章列表SELECT ... WHERE web_tag.Name = 'News'


问题

我怎样才能得到一篇文章列表DONOT包含一个标签。

我试着做

SELECT ... WHERE web_tag.Name != 'News' 

这项工作如果文章只有一个标签。如果文章显然有多个标签,它将不起作用

谢谢一堆!

回答

1

一种方式做到这一点

SELECT a.id_article, a.name 
    FROM web_article a 
WHERE NOT EXISTS 
(
    SELECT * 
    FROM web_tag_to_article ta JOIN web_tag t 
     ON ta.id_tag = t.id_tag 
    WHERE id_article = a.id_article 
    AND t.name = 'News' 
) 

SELECT id_article, name 
    FROM web_article 
WHERE id_article NOT IN 
(
    SELECT id_article 
    FROM web_tag_to_article ta JOIN web_tag t 
     ON ta.id_tag = t.id_tag 
    GROUP BY id_article 
    HAVING MAX(t.name = 'News') = 1 
) 

SELECT a.id_article, a.name 
    FROM web_article a LEFT JOIN web_tag_to_article ta 
    ON a.id_article = ta.id_article LEFT JOIN web_tag t 
    ON ta.id_tag = t.id_tag 
GROUP BY a.id_article, a.name 
HAVING MAX(COALESCE(t.name,'') = 'News') = 0 

这里是SQLFiddle演示

+0

嗯...这似乎是相当低效。但噢,工作!谢谢。 – Krimson

+0

@vidhu不客气:)查看备选方案的更新答案。 – peterm

+0

爱最后一个例子。谢谢! – Krimson

0

另一种方式

选择ID_Articles,名称,弹头从web_article其中ID_Article在 (从web_article选择除 ID_Articles(选择web_tag_to_Article ID_Article其中ID_Tag在 (从web_tag选择ID_Tag其中name = '新闻')))