有人问:
写一个语句查询 一个班级内男生、女 生分数最高的前5名
要求,不能用union,用一条SQL实现
大神1答:
select * from B where (select count(1) as num from A where A.ID = B.ID) = 0 理解一下这个应该能写的出了
大神2 答:
select a.* from 成绩表 a where (select count(*) from 成绩表 where 性别=a.性别 and 成绩+0 > a.成绩+0) <5 order by 性别,成绩 desc;
我自己做了实验:
点击(此处)折叠或打开
- mysql> select * from 成绩表;
- +------+------+------+
- | 姓名 | 性别 | 成绩 |
- +------+------+------+
- | 张1 | 男 | 99 |
- | 张2 | 男 | 99 |
- | 丽1 | 女 | 99 |
- | 丽2 | 女 | 99 |
- | 丽3 | 女 | 87 |
- | 张3 | 男 | 86 |
- | 张4 | 男 | 100 |
- | 张5 | 男 | 60 |
- | 张6 | 男 | 70 |
- | 丽4 | 女 | 71 |
- +------+------+------+
- 10 rows in set
点击(此处)折叠或打开
- mysql> select a.* from 成绩表 a where (select count(*) from 成绩表 where 性别=a.性别 and 成绩+0 > a.成绩+0) <5 order by 性别,成绩 desc;
- +------+------+------+
- | 姓名 | 性别 | 成绩 |
- +------+------+------+
- | 丽1 | 女 | 99 |
- | 丽2 | 女 | 99 |
- | 丽3 | 女 | 87 |
- | 丽4 | 女 | 71 |
- | 张4 | 男 | 100 |
- | 张1 | 男 | 99 |
- | 张2 | 男 | 99 |
- | 张3 | 男 | 86 |
- | 张6 | 男 | 70 |
- +------+------+------+
- 9 rows in set
果然! 大神就是大神!