查询所用的表结构见https://blog.csdn.net/zjhbeautiful/article/details/108065336
SQL经典50题第9题正解
题目:查询和“ 01 “号的同学学习的课程完全相同的其他同学的信息
正确解答需用到group_concat()函数,代码如下:
select
*
from
student
where
sid in (
select
sid
from
sc
group by
sid
having
group_concat(cid ORDER BY cid) = (
select
group_concat(cid ORDER BY cid)
from
sc
where
sid = '01')
and sid != '01');
注: 解答此题时需要实现组内排序再拼接(group_concat方法自身可实现组内排序),不排序会导致结果出错。
比如:s_id=01同学的c_id依次是01、02、03,但是s_id=02的某位同学的c_id是01、03、02,s_id=02同学是符合条件的,但是不排序会导致检索不到,因为s_id=01同学的字符串是‘01,02,03’,而s_id=02同学的字符串是‘01,03,02’。
作用:将组中的字符串连接成为具有各种选项的单个字符串。
完整语法
group_concat([DISTINCT] 要连接的字段 [Order BY ASC/DESC 排序字段] [Separator '分隔符'])
示例
SELECT * FROM sc;
表结构与数据如上,现在的需求就是每个sid为一行,然后一行内显示该sid所有分数
接下来用group_concat !!!
select sid,group_concat(score)
from sc
GROUP BY sid;
可以看到结果根据id 分行,并且分数默认用逗号分割,每个id有重复数据
接下来去重
select sid,group_concat(DISTINCT score)
from sc
GROUP BY sid;
select sid,group_concat(DISTINCT score ORDER BY score DESC)
from sc
GROUP BY sid;
select sid,group_concat(DISTINCT score ORDER BY score DESC SEPARATOR ';')
from sc
GROUP BY sid;