我正在构建一个非常简单的cms。
在它的两个对象为文章和标签 这里是DB模式,我有当前:构造包含映射表的查询?
使用这个我可以通过标签的文章列表SELECT ... WHERE web_tag.Name = 'News'
问题
我怎样才能得到一篇文章列表DONOT包含一个标签。
我试着做
SELECT ... WHERE web_tag.Name != 'News'
这项工作如果文章只有一个标签。如果文章显然有多个标签,它将不起作用
谢谢一堆!
我正在构建一个非常简单的cms。
在它的两个对象为文章和标签 这里是DB模式,我有当前:构造包含映射表的查询?
使用这个我可以通过标签的文章列表SELECT ... WHERE web_tag.Name = 'News'
我怎样才能得到一篇文章列表DONOT包含一个标签。
我试着做
SELECT ... WHERE web_tag.Name != 'News'
这项工作如果文章只有一个标签。如果文章显然有多个标签,它将不起作用
谢谢一堆!
一种方式做到这一点
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演示
另一种方式
选择ID_Articles,名称,弹头从web_article其中ID_Article在 (从web_article选择除 ID_Articles(选择web_tag_to_Article ID_Article其中ID_Tag在 (从web_tag选择ID_Tag其中name = '新闻')))
嗯...这似乎是相当低效。但噢,工作!谢谢。 – Krimson
@vidhu不客气:)查看备选方案的更新答案。 – peterm
爱最后一个例子。谢谢! – Krimson