Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/opencv/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql SQL选择不带特定标记的帖子_Mysql_Sql_Database_Many To Many - Fatal编程技术网

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
)