美文网首页
【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