编辑:SQL多个表实例

时间:2012-11-13 02:29:54

标签: mysql sql

我有这张桌子:

SUBSCRIPTION

NAME SUBSCRIBER

它本质上是一张表,其中列出了彼此订阅的人员。我想编写一个输出元组列表的查询,这样,如果集合B代表所有订阅A的人,B也代表A不会订阅的那些人。即找到彼此不相互认购的人员名单。

这是我写的查询:

SELECT A.name, B.name 
FROM subscription AS A, subscription AS B 
WHERE A.subscriber=B.name AND A.name!=B.subscriber;

即它应该显示两列A和B,其中B订阅A而A不订阅B.

所有我得到的都是垃圾,有很多行重复。我在这做错了什么?

好吧,我在陈述样品时犯了一个错误。样本如下:

梅丽莎,琼订阅了约翰。 查尔斯,约翰订阅了琼。 查尔斯订阅了梅丽莎。 梅丽莎,琼想订阅查尔斯。

第一部分引用订阅者列,第二部分引用name列。 也就是说,约翰是梅丽莎的名字,约翰订阅了约翰。

因此,它应该输出(梅丽莎,约翰)因为约翰没有订阅梅丽莎。

这会如何改变查询?

2 个答案:

答案 0 :(得分:1)

听起来你想要做LEFT JOIN。这将返回所有A名称并将它们链接到所有B名称。每个A名称至少会有1条记录,但可能很多。最多可以订阅名称A的B名称。如果没有B订户,则会有一个A名称,但B列的值为NULL。

SELECT A.name, B.name FROM subscription AS A 
LEFT JOIN subscription AS B ON A.subscriber=B.name AND A.name!=B.subscriber;

答案 1 :(得分:1)

这将从订阅表中提取所有记录,其中订阅表中没有对应订阅的相应匹配。

select subscriber, name
from subscription a
where not exists (
  select 1
  from subscription b
  where a.subscriber = b.name
        and a.name = b.subscriber)