在参考博客文章中, 13、查询和"01"号的同学学习的课程完全相同的其他同学的信息。 给出的参考答案是:
select Student.* from Student where SID in (select distinct SC.SID from SC where SID <> ‘01’ and SC.CID in (select distinct CID from SC where SID = ‘01’) group by SC.SID having count(1) = (select count(1) from SC where SID=‘01’))我们可以看出,这个查询结果是正确的
百度这个问题,在这篇博客,可点击查看,解决办法是
select * from student where sid in (select sid from grade2 where sid not in (select sid from grade2 where cid not in (select cid from grade2 where sid='01')) group by sid having count(*)=(select count(*) from grade2 where sid='01') and sid != '01');第一眼看上去还是在比较查询结果数量,而且看上去嵌套很多很复杂。也可以研究下他的思路。
我就问我的研发老公,他说拼接字符串很简单,让我自己查,于是找到了函数group_concat(),这个函数可以将查询结果集拼接成字符串,然后进行比较。
select a.* from student a,sc b where a.sid=b.sid and a.sid <>'06' group by a.sid having group_concat(b.cid)= (select group_concat(b.cid) from student a,sc b where a.sid=b.sid and a.sid ='06' order by cid desc)就这样问题就解决了,不明白group by 和having用法的话,可参考我的另一篇博客。
如有错误,可以在下方评论联系我,谢谢!
