Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2225902
  • 博文数量: 287
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 2130
  • 用 户 组: 普通用户
  • 注册时间: 2014-03-31 14:30
个人简介

自己慢慢积累。

文章分类

全部博文(287)

分类: Mysql/postgreSQL

2015-08-24 16:23:23

在群里看各位大神们聊天,看到一个有意思的需求和一个有意思的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;


我自己做了实验:

点击(此处)折叠或打开

  1. mysql> select * from 成绩表;
  2. +------+------+------+
  3. | 姓名 | 性别 | 成绩 |
  4. +------+------+------+
  5. | 张1 || 99 |
  6. | 张2 || 99 |
  7. | 丽1 || 99 |
  8. | 丽2 || 99 |
  9. | 丽3 || 87 |
  10. | 张3 || 86 |
  11. | 张4 || 100 |
  12. | 张5 || 60 |
  13. | 张6 || 70 |
  14. | 丽4 || 71 |
  15. +------+------+------+
  16. 10 rows in set

点击(此处)折叠或打开

  1. mysql> select a.* from 成绩表 a where (select count(*) from 成绩表 where 性别=a.性别 and 成绩+0 > a.成绩+0) <5 order by 性别,成绩 desc;
  2. +------+------+------+
  3. | 姓名 | 性别 | 成绩 |
  4. +------+------+------+
  5. | 丽1 || 99 |
  6. | 丽2 || 99 |
  7. | 丽3 || 87 |
  8. | 丽4 || 71 |
  9. | 张4 || 100 |
  10. | 张1 || 99 |
  11. | 张2 || 99 |
  12. | 张3 || 86 |
  13. | 张6 || 70 |
  14. +------+------+------+
  15. 9 rows in set


果然! 大神就是大神!

阅读(959) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~