我整天都在研究一个我认为很简单但事实证明非常难以捉摸的问题。我怀疑我可能没有问正确的问题,所以请多多包涵。
我有一张桌子,上面有一堆报纸文章,用于一个研究项目。这个想法是研究人员可以标记单个文章。这些标签存储在第二个表中。一篇文章可以有任意数量的标签。
然后我可以通过使用选择具有特定标签的文章;
SELECT *,
GROUP_CONCAT(`TAGS`.`TAG`) AS tags
FROM ARTICLES
LEFT JOIN TAGS
ON TAGS.ID = ARTICLES.ID
WHERE TAGS.TAG = 'search term'
GROUP BY ARTICLES.ID;
当我想根据缺少特定标签来选择文章时,我的问题就开始了。如果一篇文章只有一个标签,则结果符合预期,但如果有多个标签与一篇文章相关联,则简单地省略该标签。
SELECT *,
GROUP_CONCAT(`TAGS`.`TAG`) AS tags
FROM ARTICLES
LEFT JOIN TAGS
ON TAGS.ID = ARTICLES.ID
WHERE TAGS.TAG != 'search term'
OR TAGS.TAG IS NULL
GROUP BY ARTICLES.ID;
如果原始表格如下;
ID Name
1 Article #1
2 Article #2
和;
ArticleID Tag
1 New
1 Long
1 Boring
2 Old
2 Long
2 Interesting
然后,如果我使用上面的查询来选择标签!=无聊的文章,结果将是;
ArticleID Name Tags
1 Article #1 New, Long
2 Article #2 Old, Long, Interesting
我怎样才能让它完全排除第一篇文章,而不是仅仅排除那个标签?记住数据库中有超过十万篇文章,最有效的方法是什么?我查看了许多其他问题和谷歌搜索,但选择没有这样的标签是我找不到建议的事情。
在旁注中,我目前使用的是一对多表,因为每个标签对于它链接到的每篇文章都会出现一次。我注意到很多类似场景的人都使用多对多的设计。这比在标签表中只有一个外键引用文章表要快得多吗?
感谢您帮助 SQL 菜鸟 :)。