在群里看各位大神们聊天,看到一个有意思的需求和一个有意思的SQL
有人问:
写一个语句查询 一个班级内男生、女 生分数最高的前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
果然! 大神就是大神!
阅读(1001) | 评论(0) | 转发(0) |