一、问题
在数据库中,找到和某个学生选课一模一样的学生(不是选课有重叠的)
二、测试数据(数据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)