我正在使用在线斯坦福数据库课程练习刷新我的SQL,找到here。这是问题所在:
“查找只有朋友的学生的姓名和成绩 年级。返回按成绩排序的结果,然后按名称排列 级“。
我们有一个highschooler
表,其中包含name
,grade
,id
属性。此外,likes
表包含属性id1
和id2
。 id1
中的id2
和likes
与id
中的highschooler
相对应。
根据问题部分来源,我可以说我需要使用子查询,但我不知道在哪里。我该如何处理这个问题?目前建议的解决方案都不起作用。
这是我当前的SQL语句,它无法正常工作(忽略排序):
select distinct
student1.id,
student1.name,
student1.grade
from
highschooler student1,
highschooler student2,
friend
where not exists (select *
from friend
where student1.id = id1
and student2.id = id2
and student1.grade = student2.grade
and student1.id <> student2.id);
答案 0 :(得分:0)
我认为,如果A是B的朋友,则等于B是A的朋友。
CREATE VIEW Temp
AS
SELECT id,name,grade,id2,[grd2] FROM highschooler
INNER JOIN Likes ON highschooler.id = Likes.id1
INNER JOIN (SELECT id as [id2t], grade as [grd2] from highschooler) a ON a.id2t = Likes.id2
UNION ALL
SELECT id,name,grade,[id1] as [id2],[grd2] FROM highschooler
INNER JOIN Likes ON highschooler.id = Likes.id2
INNER JOIN (SELECT id as [id2t], grade as [grd2] from highschooler) a ON a.id2t = Likes.id1
temp 视图让我拥有了我需要的所有信息。
CREATE VIEW PlayWithClassMate
AS
SELECT distinct id FROM Temp WHERE grade = grd2
这个 PlayWithClassMate 视图让我让所有与她/他的同学一起玩的学生(有些人,我认为一个人可以玩,他/她的朋友不是他们的同学)。
CREATE VIEW IDResult
AS
SELECT id FROM (
SELECT id, COUNT(GRD2) as c FROM TEMP
WHERE id in (SELECT id FROM PlayWithClassMate)
GROUP BY ID) A
WHERE C>1
此 IDResult 视图包含问题的所有ID。 现在,选择您需要的任何内容,其ID IDResult
我认为这不是最好的,或者可能是最糟糕的,但它确实有效。 (srr abt terribe语法)
答案 1 :(得分:-1)
这比它看起来更难,因为它需要按顺序准备套装。但是,有几种方法可以解决这个问题。以下是我们想到的:
首先,按年级分别为每个人找到朋友的朋友:
[ID],[FoF ID],[FoF等级]
您确实不需要[FoF ID],但在调试时可能会有所帮助。
然后,作为二阶运算,你需要产生一个[ID]列表,其中[FoF等级]等于MAX()和MIN():
SELECT [ID],MAX(FoF等级)为A,MIN(FoF等级)为B FROM [上述] WHERE A = B
<强>更新强>: 我意识到我还应该在最后的qry中添加:A = B和A = Grade。然后这个解决方案有效请记住:它只回答“查找只有同一年级朋友的学生的姓名和成绩”的问题。它假设友谊是单向的。 (对不起,我不得不放弃一些东西。)
对于那些需要查看SQL的人,请点击此处。它是为MS Access编写的,但很容易移植(通过删除最内层查询中的“()”开始)到MySQL,PGSQL或Oracle。更好的是,没有程序扩展和临时表。
选择 名称 从 ( 选择 ID ,名称 ,年级 ,min(friend_grade)为min_friend_grade ,max(friend_grade)为max_friend_grade 从 ( 选择 hs1.ID ,hs1.name ,hs1.grade ,l.ID2为friend_id ,hs2.name为friend_name ,hs2.grade为friend_grade
这 (highschooler hs1 INNER JOIN喜欢l ON(hs1.ID = l.ID1)) INNER JOIN highschooler hs2 ON(l.ID2 = hs2.ID)
)导电泡棉
GROUP BY ID ,名称 ,等级
)FoF_max_min
WHERE 级= min_friend_grade AND min_friend_grade = max_friend_grade