早/晚/晚
我正在为此SQL查询苦苦挣扎,在其中我应该找到所有比他们认识的人年龄更大的人。因此,我应该找到伍迪和苏珊,因为他们两个(伍迪认识彼得,苏珊也认识彼得)都认识一个比他们年轻的人。
可以找到这些表:here(为了方便访问,我还将在问题的末尾写它们)
关于如何解决这个问题的任何建议?
餐桌人
| id | name | age
+----+-----------+------
| 11 | Woody | 63
| 12 | Peter | 19
| 13 | Susan | 33
| 14 | Sigourney | 24
表知道
| id | IDpersonA | IDpersonB
+----+-----------+----------
| 17 | 11 | 12
| 19 | 11 | 13
| 15 | 11 | 14
| 18 | 12 | 13
| 16 | 14 | 12
Ref:
在这种情况下,您可以使用all
:
select p.*
from people p
where p.age > all (select p2.age
from knows k join
people pb
on k.IDpersonB = pb.id
where k.IDpersonA = p.id
);
这将返回不认识任何人的人。
您还可以在子查询中使用聚合:
select p.*
from people p
where p.age > (select max(p2.age)
from knows k join
people pb
on k.IDpersonB = pb.id
where k.IDpersonA = p.id
);
这是完全不同的。它要求某人至少认识一个人。
这里是使用not exists
的方法:
select p.*
from persons p
where not exists (
select 1
from knows k
inner join persons p1 on p1.id = k.idPersonB
where p.id = k.idPersonA and p1.age > p.age
)
如果要确保结果集中的人员认识至少一个其他人:
select p.*
from persons p
where
exists (select 1 from knows k where p.id = k.idPersonA)
and not exists (
select 1
from knows k
inner join persons p1 on p1.id = k.idPersonB
where p.id = k.idPersonA and p1.age > p.age
)