使用子查询时,为什么我的结果重复?

时间:2013-10-19 07:04:01

标签: mysql sql database

请记住,我是MySQL的新手。

当我尝试选择一组结果时,我感到困惑。

select A.userNum from tableOne A, tableTwo B where A.userNum!=B.userNum;

(表A包含用户的用户号码和电话号码。表B包含用户的地址簿。)

ResultSet包含多组类似的结果。每个结果都省略了我在where子句中指定的一个userNum。 (见本问题的结尾)

如何获得只包含一个满足“where A.userNum!= B.userNum”子句的结果的ResultSet?

这是我遇到麻烦的具体案例。

假设我有两个表,用户和地址簿。

表'adressbook'基本上是一本地址簿。表'users'是一个包含用户电话号码的表。

我创建了表格。为简单起见,'userNum'和'phone'号码在'users'表中相同。

create table users (
    userNum int,
    phone char(11)
);
insert into users values (1,'1');
insert into users values (2,'2');
insert into users values (3,'3');
insert into users values (4,'4');
insert into users values (5,'5');
insert into users values (6,'6');
insert into users values (7,'7');
insert into users values (8,'8');
insert into users values (9,'9');
insert into users values (10,'10');

create table addressbook (
    userNum int,
    phone char(11)
);
insert into addressbook values(1,'2');
insert into addressbook values(1,'3');
insert into addressbook values(2,'3');
insert into addressbook values(3,'4');
insert into addressbook values(5,'7');
insert into addressbook values(5,'8');
insert into addressbook values(6,'7');
insert into addressbook values(7,'8');
insert into addressbook values(7,'9');
insert into addressbook values(9,'10');

接下来,我会找到朋友朋友的'userNum'。假设我是userNum 1。

首先,我找到了我朋友的'userNum'。

select A.userNum from users A, addressbook B where B.userNum=1 and B.phone=A.phone;

然后使用此查询,我找到了我朋友的朋友的'userNum'。

select A.userNum from users A, addressbook B, (select A.userNum from users A, addressbook B where B.userNum=1 and B.phone=A.phone) C 
where C.userNum=B.userNum and A.phone=B.phone;

结果是3,4。 (奇怪的是,当我使用子查询时,此处的ResultSet不会重复。)


问题从这里开始。

使用上面的选择陈述作为子查询B,我试图让那些不是我朋友的朋友的'userNum'。

select A.userNum from users A, 
    (select A.userNum from users A, addressbook B, (select A.userNum from users A, addressbook B where B.userNum=1 and B.phone=A.phone) C where C.userNum=B.userNum and A.phone=B.phone) B 
    where A.userNum!=B.userNum;

结果

userNum
1
2
4
5
6
7
8
9
10
1
2
3
5
6
7
8
9
10

从结果中可以看出,有两组结果。第一个结果省略了userNum 3,第二个userNum 4。

如何获得一组省略userNum 3,4的用户名?

1 个答案:

答案 0 :(得分:2)

select A.userNum from users A where A.userNum NOT IN  (select A.userNum from users A, addressbook B, (select A.userNum from users A, addressbook B where B.userNum=1 and B.phone=A.phone) C where C.userNum=B.userNum and A.phone=B.phone) ;