问题描述
嗨,我的问题是我必须列出所有单身关系(A喜欢B,但B不喜欢A)
A B
1 2
2 1
3 1
在此示例中,我的解决方案是一对3 1(因为1喜欢2,而2也喜欢1背) 我应该如何用SQL形式表达它?
解决方法
您可以将查询的表达方式与编写问题的方式非常相似。您正在寻找没有“ B喜欢A”行的“ A喜欢B”行。
假设表的名称为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
请参见demo。
结果:
| 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 SLEECT匹配的所有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 提琴here