如何解决SQL单向对

问题描述

嗨,我的问题是我必须列出所有单身关系(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);

请注意,如果abNULL,这将不起作用(但我想在这个示例中不可能如此)。

通常,我建议为此使用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

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...