该数据库是:

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

朋友(ID1,ID2)英语:ID1的学生是ID2的学生的朋友。友谊是相互的,因此如果(123,456)在“朋友”表中,则(456,123)也是如此。

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

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

一个命令是:

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


这两个命令都表明我们只想和同等级的朋友找到高中生。但是结果是不同的。哪一个是正确的,另外一个告诉我们什么?如果某些专家可以提供一些解释,我将非常感谢,

最佳答案

如果您想和同等级的朋友一起找到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/

10-09 21:07