嗨,我的问题是我必须列出所有未回报的关系(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);
需要注意的是,如果a
或b
是NULL
,这将不起作用(但我猜在本例中不可能是这样(。
一般来说,我推荐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;小提琴这里