sql选择没有特定标签的文章

gzjq41n4  于 2021-06-24  发布在  Mysql
关注(0)|答案(3)|浏览(288)

直截了当。我有三张table,贴子,贴子

POSTS { p_id, title }
TAGS { t_id, name }
POST_TAGS { p_id, t_id }

一篇文章可以有多个标签,我想选择所有没有特定标签的文章。以演示数据为例:

TASKS
p_id | title
1      MyPost 1
2      MyPost 2
3      MyPost 3

TAGS
t_id | name
1      red
2      green

POST_TAGS
p_id | t_id
1      1
2      1
2      2
3      2

现在我想看到所有的职位,没有标签'绿色'。我当前的sql查询如下所示:

SELECT DISCTINCT
   p.p_id, p.title 
FROM
   POSTS as p,
   POST_TAGS as pt
WHERE 
   pt.p_id = p.p_id AND pt.t_id != 2

但这会还我这个

RESULT
p_id | title
1      MyPost 1
2      MyPost 2

因为“mypost2”也有红色标签,所以它是listet。
期望的结果是:

RESULT
p_id | title
1      MyPost 1

编辑:感谢你们,我接受了garethd的答案,因为不存在更不言自明。not in正在工作,但不是空保存(即使我没有要求它-也要感谢nico haase)
德国的解决方案也是正确和有效的,但并不像选定的答案那样不言自明。多亏了你。

pkwftd7m

pkwftd7m1#

这将完成这项工作,因为它在内部查询中搜索所有标记为2的帖子,并在外部查询中排除它们

SELECT DISTINCT p.p_id WHERE p.p_id NOT IN(
    SELECT DISCTINCT
       p.p_id 
    FROM
       POSTS as p,
       POST_TAGS as pt
    WHERE 
       pt.p_id = p.p_id AND pt.t_id = 2
)
mbyulnm0

mbyulnm02#

你可以使用 NOT EXISTS :

SELECT p.p_id, p.title 
 FROM   POSTS AS p
 WHERE  NOT EXISTS 
        (   SELECT  1 
            FROM    POST_TAGS AS pt 
            WHERE   pt.p_id = p.p_id
            AND     pt.t_id = 2
        );
yuvru6vn

yuvru6vn3#

您可以明确地加入寻找绿色标记,并显示那些加入不成功的帖子:

SELECT
   p.p_id, p.title 
FROM
   POSTS as p
LEFT OUTER JOIN
   POST_TAGS as pt on pt.p_id = p.p_id AND pt.t_id = 2 
WHERE 
   pt.p_id is null

相关问题