美文网首页
【SQL】如何在学生数据库中找到和某个学生选课一样的其他学生?

【SQL】如何在学生数据库中找到和某个学生选课一样的其他学生?

作者: 云落青岚 | 来源:发表于2019-10-22 15:37 被阅读0次

一、问题

在数据库中,找到和某个学生选课一模一样的学生(不是选课有重叠的)

二、测试数据(数据ER图)

三、解法与思路

解法一:

思路:直接用IN的话,会找出课程和01同学一样,但可能学得比01同学少的人

所以要先找出所学课程和01同学数量一样的人,在用IN看课程是否一样

1.第一步,用student与sc连接,找出和01同学所学数量课程一样的人,给表取名Samecount_SId01,其实是一个筛选后缩小的student表

2.把和01同学选课数量一样的同学筛选后,和sc再次连接,准备做相同于不同的判断

3.在挑选出的和01同学课程数量一致的同学挑选出来后,还要看该同学课程是否和01同学一样,比如01同学选课ABC,02同学选课ABD,就是梳理一样,但课程不一样。

解法如下:

SELECT *

FROM sc JOIN

(SELECT DISTINCT student.SId,Sname,Sage,Ssex,COUNT(CId)AS AllCount_CId

FROM sc JOIN student ON sc.SId=student.SId

GROUP BY SId

HAVING COUNT(CId)=(SELECT COUNT(CId)FROM sc WHERE SId='01'))

AS Samecount_SId01

ON sc.SId=Samecount_SId01.SId

GROUP BY sc.SId

HAVING COUNT(CId)=(SELECT COUNT(CId)FROM sc WHERE SId='01')

解法二:

思路:

使用函数GROUP_CONCAT()

这个函数是将GROUP BY产生的同一个分组中的值连接起来,返回一个字符串,然后对字符串进行对比

GROUP_CONCAT([DISTINCT] 要连接的字段 [Order BY ASC/DESC 排序字段] [Separator '分隔符'])

即将所有学生的课程ID排序并合并,比较合并后的ID是否一样,就可以省去解法一中判断数量的步骤

SELECT student.SId,Sname,Sage,Ssex,GROUP_CONCAT(DISTINCT CId ORDER BY student.SId,CId SEPARATOR '-')AS Concat_CId

FROM sc

JOIN student ON sc.SId=student.SId

GROUP BY SId

HAVING CONCAT_CId=

(SELECT concat_CId_SId01

FROM

(SELECT SId,GROUP_CONCAT(DISTINCT CId ORDER BY SId,CId SEPARATOR '-')AS concat_CId_SId01

FROM sc WHERE SId=01 GROUP BY SId)AS course_SId01)

相关文章

网友评论

      本文标题:【SQL】如何在学生数据库中找到和某个学生选课一样的其他学生?

      本文链接:https://www.haomeiwen.com/subject/lfbqvctx.html