如何解决SQL单回报对



嗨,我的问题是我必须列出所有未回报的关系(A喜欢B,但B不喜欢A(

A B 
1 2 
2 1 
3 1 

在这个例子中,我的解决方案是3对1(becoz 1喜欢2,2也喜欢1背(我应该如何用SQL的形式表达它?

您可以将查询公式化为与编写问题的方式非常相似的方式。您正在查找";A喜欢B";对此;B喜欢A";行存在。

假设表的名称为mytable:

select *
from mytable t1
where not exists (
select *
from mytable t2
where t1.A = t2.B and t1.B = t2.A
);

使用仅返回不匹配行的自身LEFT联接:

select t1.*
from tablename t1 left join tablename t2
on t2.a = t1.b and t2.b = t1.a
where t2.a is null

请参阅演示
结果:

| A   | B   |
| --- | --- |
| 3   | 1   |

MySQL方便地支持带有in的元组。因此,一种方法是:

select t.*
from t
where (b, a) not in (select a, b from t);

需要注意的是,如果abNULL,这将不起作用(但我猜在本例中不可能是这样(。

一般来说,我推荐exists用于此目的,正如C.C.的回答所示。

您可以使用NOT IN wit SLECT所有具有匹配的id

CREATE TABLE rel (
`A` INTEGER,
`B` INTEGER
);
INSERT INTO rel
(`A`, `B`)
VALUES
('1', '2'),
('2', '1'),
('3', '1');
SELECT A,B FROM rel WHERE A NOT IN (SELECT r1.A FROM rel r1 INNER JOIN rel r2 ON r1.A = r2.B and r1.B = r2.A)
A|B-:|-:3|1

db<gt;小提琴这里

最新更新