3

我整天都在研究一个我认为很简单但事实证明非常难以捉摸的问题。我怀疑我可能没有问正确的问题,所以请多多包涵。

我有一张桌子,上面有一堆报纸文章,用于一个研究项目。这个想法是研究人员可以标记单个文章。这些标签存储在第二个表中。一篇文章可以有任意数量的标签。

然后我可以通过使用选择具有特定标签的文章;

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 菜鸟 :)。

4

3 回答 3

1

试试这个:

SELECT  A.ID, 
        A.`Name`,
        GROUP_CONCAT(`TAGS`.`TAG`) AS tags 
FROM   ARTICLES A
       LEFT JOIN TAGS 
               ON TAGS.ID = A.ID 
WHERE   NOT EXISTS( SELECT 1 FROM TAGS 
                    WHERE ID = A.ID
                    AND Tag = 'search term')
GROUP  BY ARTICLES.ID, ARTICLES.`Name`; 
于 2013-08-28T17:48:07.507 回答
0

我会这样做:

SELECT *, 
       GROUP_CONCAT(`TAGS`.`TAG`) AS tags 
FROM   ARTICLES A
       LEFT JOIN TAGS 
           ON TAGS.ID = ARTICLES.ID 
WHERE A.ID NOT IN (
    SELECT ArticleID FROM TAGS
    WHERE Tag = 'search term'
)
GROUP BY A.ID;
于 2013-08-28T18:15:04.737 回答
0
SELECT  A.ID, 
        A.`Name`,
        GROUP_CONCAT(`TAGS`.`TAG`) AS tags 
FROM   ARTICLES A
       LEFT JOIN TAGS 
 ON TAGS.ID = A.ID 

LEFT JOIN  (
    SELECT ArticleID FROM TAGS LKP
    WHERE Tag = 'search term'
) SRCH
 ON SRCH. ArticleID =A.ID
WHERE SRCH. ArticleID IS NUll
于 2013-08-28T18:55:18.233 回答