Mysql group_concat()

group_concat()聚合函数

 

使用sql45题的数据写2个查询语句:

select * from sc where sid = "01";
+------+------+-------+
| SId  | CId  | score |
+------+------+-------+
| 01   | 01   |  80.0 |
| 01   | 02   |  90.0 |
| 01   | 03   |  99.0 |
+------+------+-------+ 
mysql> select sid, group_concat(cid) from sc group by sid having sid = "01";
+------+-------------------------------+
| sid  | group_concat(cid) 
+------+-------------------------------+
| 01   | 01,02,03                      |
+------+-------------------------------+

The MySQL GROUP_CONCAT() function is an aggregate function that concatenates strings from a group into a single string with various options.

 

把一列数据聚合成一个单一的string。有几个参数:

GROUP_CONCAT(
    DISTINCT expression
    ORDER BY expression
    SEPARATOR sep
);

 

sql45题中的第9题用到了group_concat()

-- 9.查询和" 01 "号的同学学习的课程 完全相同的其他同学的信息
-- 解题思路:
-- 1.教程里面给了一篇文章谈到大数据下,尽量不要使用复杂的嵌套子查询。不利于运行效率。
-- 2.基于这个事实,我的代码分成2条查询语句
-- 3.第一条查询到'01'号同学学习的课程。这里有2个知识点:
--   其中一个是教程里面已经提到:group_concat。
--   另一个是user-defined variable。所以可以使用@grou_c储存我们刚刚查询到的数据。
-- 4.第二条查询,
--   把Student左关联SC,然后剔除"01"号同学的记录。
--   然后分组,使用having条件语句,筛选出和"01"号同学的课程完全一样的学生。

select sid, @group_c := group_concat(cid) from sc group by sid having sid = "01";

select Student.Sname from student
left join SC on SC.sid = Student.sid and SC.sid <> "01"
group by Student.Sname
having group_concat(sc.cid) = @group_c;
-- +--------+
-- | Sname  |
-- +--------+
-- | 孙风   |
-- | 李云   |
-- | 钱电   |
-- +--------+

 

我的sql45题的部分答案:https://github.com/chentianwei411/sql-45-

posted @ 2020-01-02 17:11  Mr-chen  阅读(243)  评论(0编辑  收藏  举报