首页 > 技术文章 > 9.查询和" 01 "号的同学学习的课程完全相同的其他同学的信息的一种实现方式,及group_concat实现group by组内排序

coderjjp 2020-05-21 18:41 原文

在网上看到一位网友写的实现代码如下:

select
    *
from
    student
where
    s_id in (
    select
        s_id
    from
        score t1
    group by
        s_id
    having
        group_concat(c_id) = (
            select group_concat(c_id) as str2
        from
            score
        where
            s_id = '01')
        and s_id != '01');

但是这段代码有bug,那就是比如s_id=01同学的c_id依次是01、02、03,但是s_id=0x的某位同学的c_id是01、03、02,0x同学是符合条件的,但是上面代码检索不到,一位01同学的字符串是‘01,02,03’,而0x同学的字符串是‘01,03,02’。

所以要想满足需求,需要实现组内排序再拼接,在网上找了很多文章都没有正确解答,最后发现group_concat方法自身是可以实现组内排序的。。。。

具体代码如下:

select
    *
from
    student
where
    sid in (
    select
        sid
    from
        sc t1
    group by
        sid
    having
        group_concat(cid ORDER BY cid) = (
            select group_concat(cid ORDER BY cid) as str2
        from
            sc
        where
            sid = '01')
        and sid != '01');

 实现方式2:

select a.* from student a where a.sid in(
    select sid from sc where sid != '01' and cid in
                (select cid from sc where sid = '01')
    group by sid having count(1)=
                ( select count(1) from sc where sid = '01'));

推荐阅读