在網上看到一位網友寫的實現代碼如下:
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'));