gpt4 book ai didi

mysql - 子查询和相关查询

转载 作者:行者123 更新时间:2023-11-29 22:21:18 27 4
gpt4 key购买 nike

数据库是:

高中生(ID、姓名、年级)英语:某个年级有一名具有唯一 ID 和给定名字的高中生。

friend ( ID1, ID2 ) 英语:ID1 的学生与 ID2 的学生是 friend 。友谊是相互的,所以如果 (123, 456) 在 Friend 表中,那么 (456, 123) 也在。

喜欢 ( ID1, ID2 ) 英语:ID1 的学生喜欢 ID2 的学生。喜欢某人不一定是相互的,因此如果“喜欢”表中存在 (123, 456),则不能保证 (456, 123) 也存在。

任务是:查找只有同年级 friend 的学生的姓名和成绩。返回按年级排序的结果,然后按每个年级中的名称排序。

一个命令是:

select distinct name, grade
from Highschooler s1
where not exists (select * from Highschooler s2 join Friend on (Friend.ID2 = s2.ID)
where s1.ID = Friend.ID1
and s2.grade <> s1.grade)
order by grade, name

第二个命令是:

select distinct name, grade
from Highschooler s1 join Friend on (Friend.ID1 = s1.ID)
where not exists (select * from Highschooler s2
where Friend.ID2 = s2.ID
and s2.grade <> s1.grade)
order by grade, name

这两个命令都表示我们只想找出同年级好友的高中生。但结果不同。哪一项是正确的,另一项告诉我们什么?如果有专家能提供一些解释,我将不胜感激,

最佳答案

如果你想和 friend 一起认识 Highscooler 并且相同等级,我想你需要这个:

select distinct s1.name, s1.grade
from Highschooler s1
join Friend on (Friend.ID1 = s1.ID or Friend.ID2 = s1.ID)
join Highschooler s2 on ((Friend.ID1 = s2.ID and Friend.ID2 = s1.ID) or (Friend.ID1 = s1.ID and Friend.ID2 = s2.ID)) /* sent or received request */
where s1.grade = s2.grade /* same grade */
order by s1.grade, s1.name

关于mysql - 子查询和相关查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30685569/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com