SQL选择没有特定标记的帖子

时间:2018-01-15 15:00:58

标签: mysql sql database many-to-many

直截了当。 我有三个表POSTS,TAGS,POST_TAGS

#include<iostream>
#include<stdio.h>
using namespace std;
class Node
{
    int data;
    Node *next;
public:
    Node(int n)
    {
        data=n;
        next=NULL;
    }
    friend class List;
};
class List
{
    Node *listptr;
public:
void create();
void display();
};
void List::create()
{
    Node *temp;
    int n, num;
    cout << "Enter number of nodes:" << endl;
    cin >> n;
    cout << "/nEnter the data" << endl;
    for(int i=0; i<n; i++)
    {
        cin >> num;
        Node *new_node=new Node(num);
        if(listptr==NULL)
            listptr=temp=new_node;
        else
        {
            temp->next=new_node;
            temp=temp->next;
        }
    }
}
void List::display()
{
    Node *temp=listptr;
    while(temp!=NULL)
    {
        cout << temp->data << "->";
        temp=temp->next;
    }
}
 main()
{
    List l1;
    l1.create();
    l1.display();
}

一个帖子可以有多个标签,我想选择所有没有特定标签的帖子。例如,获取此演示数据:

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

现在我想看到所有没有TAG&#39;绿色&#39;的POSTS。我当前的SQL查询如下所示:

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

但这会让我回复

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 

因为&#39; MyPost 2&#39;它也是TAG红色的倾听。

期望的结果是:

RESULT
p_id | title
1      MyPost 1
2      MyPost 2

编辑: 感谢你们所有人,我接受了GarethD的回答,因为NOT EXISTS更加不言自明。 NOT IN工作但不是NULL保存(即使我不是要求它 - 感谢Nico Haase也是如此)

GermanC解决方案也是正确且有效的,但并不像所选答案那样不言自明。谢谢你。

3 个答案:

答案 0 :(得分:3)

您可以使用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
        );

答案 1 :(得分:1)

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

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 :(得分:0)

这将完成这项工作,因为它会搜索内部查询中标记为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
)