直截了当。 我有三个表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解决方案也是正确且有效的,但并不像所选答案那样不言自明。谢谢你。
答案 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
)