Mysql SQL选择不带特定标记的帖子
直截了当。 我有三张桌子贴子,标签,贴子标签Mysql SQL选择不带特定标记的帖子,mysql,sql,database,many-to-many,Mysql,Sql,Database,Many To Many,直截了当。 我有三张桌子贴子,标签,贴子标签 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_TAG
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
因为“MyPost 2”也有红色标签,所以它是Liset
预期结果是:
RESULT
p_id | title
1 MyPost 1
编辑:
多亏了你们,我接受了GarethD的答案,因为“不存在”更是不言自明。NOT IN正在工作,但不是空保存(即使我没有要求它-也要感谢Nico Haase)
德国的解决方案也是正确和有效的,但并不像选择的答案那样不言自明。也感谢您。您可以使用以下方法完成此操作:
您可以使用以下方法执行此操作:
您可以通过查找绿色标记明确加入,并显示加入未成功的帖子:
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
您可以通过查找绿色标记明确加入,并显示加入未成功的帖子:
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
这将完成这项工作,因为它在内部查询中搜索所有标记为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
)
这将完成这项工作,因为它在内部查询中搜索所有标记为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
)