免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 12834 | 回复: 10
打印 上一主题 下一主题

【讨论中】题目求教:求每个人的最高成绩 [复制链接]

论坛徽章:
3
2015亚冠之卡尔希纳萨夫
日期:2015-08-04 19:46:43数据库技术版块每日发帖之星
日期:2015-08-07 06:20:00数据库技术版块每日发帖之星
日期:2016-08-15 06:20:00
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2013-07-08 11:47 |只看该作者 |倒序浏览
本帖最后由 cenalulu 于 2013-07-09 10:03 编辑
  1. master>select * from result;
  2. +----+-------+-------------+-------+
  3. | id | name  | subject     | score |
  4. +----+-------+-------------+-------+
  5. |  1 | tom   | english     |    92 |
  6. |  2 | tom   | Mathematics |    99 |
  7. |  3 | jack  | english     |    95 |
  8. |  4 | susan | english     |   100 |
  9. |  5 | jimmy | english     |    97 |
  10. |  6 | john  | english     |    77 |
  11. |  7 | jack  | Mathematics |    99 |
  12. |  8 | susan | Mathematics |   100 |
  13. |  9 | jimmy | Mathematics |    99 |
  14. | 10 | john  | Mathematics |    91 |
  15. | 11 | tom   | Science     |    71 |
  16. | 12 | jack  | Science     |    92 |
  17. | 13 | susan | Science     |   100 |
  18. | 14 | jimmy | Science     |    87 |
  19. | 15 | john  | Science     |   100 |
  20. | 16 | tom   | sport       |   100 |
  21. | 17 | jack  | sport       |    97 |
  22. +----+-------+-------------+-------+
  23. 17 rows in set (0.00 sec)
复制代码
最总显示每个人最高成绩,显示name、subject、score三个字段
  1. +----+-------+-------------+-------+
  2. | id | name  | subject     | score |
  3. +----+-------+-------------+-------+
  4. |  7 | jack  | Mathematics |    99 |
  5. |  9 | jimmy | Mathematics |    99 |
  6. | 15 | john  | Science     |   100 |
  7. |  4 | susan | english     |   100 |
  8. | 16 | tom   | sport       |   100 |
  9. +----+-------+-------------+-------+
  10. 5 rows in set (0.00 sec)
复制代码

论坛徽章:
16
IT运维版块每日发帖之星
日期:2015-10-02 06:20:00IT运维版块每月发帖之星
日期:2015-09-11 19:30:52IT运维版块每周发帖之星
日期:2015-09-11 19:20:31IT运维版块每日发帖之星
日期:2015-08-26 06:20:00每日论坛发贴之星
日期:2015-08-20 06:20:00IT运维版块每日发帖之星
日期:2015-08-20 06:20:002015年辞旧岁徽章
日期:2015-03-03 16:54:15金牛座
日期:2014-05-04 16:58:09双子座
日期:2013-12-17 16:44:37辰龙
日期:2013-11-22 15:20:59狮子座
日期:2013-11-18 22:55:08射手座
日期:2013-11-12 10:54:26
2 [报告]
发表于 2013-07-08 11:58 |只看该作者
select id,name,subject,max(score) from result  group by name ;?

论坛徽章:
0
3 [报告]
发表于 2013-07-08 11:58 |只看该作者
用mysql 的set var 来模拟postgresql的窗口函数实现

论坛徽章:
154
2022北京冬奥会纪念版徽章
日期:2015-08-07 17:10:5720周年集字徽章-年
日期:2022-10-26 16:44:2015-16赛季CBA联赛之深圳
日期:2022-11-02 14:02:4515-16赛季CBA联赛之八一
日期:2022-11-28 12:07:4820周年集字徽章-20	
日期:2023-07-19 08:49:4515-16赛季CBA联赛之八一
日期:2023-11-04 19:23:5115-16赛季CBA联赛之广夏
日期:2023-12-13 18:09:34
4 [报告]
发表于 2013-07-08 14:34 |只看该作者
要用group by,感觉楼上两位对了

论坛徽章:
9
每日论坛发贴之星
日期:2016-01-04 06:20:00数据库技术版块每日发帖之星
日期:2016-01-04 06:20:00每日论坛发贴之星
日期:2016-01-04 06:20:00数据库技术版块每日发帖之星
日期:2016-01-04 06:20:00IT运维版块每日发帖之星
日期:2016-01-04 06:20:00IT运维版块每日发帖之星
日期:2016-01-04 06:20:00综合交流区版块每日发帖之星
日期:2016-01-04 06:20:00综合交流区版块每日发帖之星
日期:2016-01-04 06:20:00数据库技术版块每周发帖之星
日期:2016-03-07 16:30:25
5 [报告]
发表于 2013-07-09 10:03 |只看该作者
科目名和分数不关连,group by + max显然是不对的。
楼主可以搜下 group by top n 的关键字,方法有很多种就不赘述了

论坛徽章:
0
6 [报告]
发表于 2013-07-15 16:48 |只看该作者
本帖最后由 huowz 于 2013-07-15 17:01 编辑

2楼的恐怕不行,
  1. SELECT SUBSTRING_INDEX(score,'-',-1) AS id
  2.        ,NAME
  3.        ,MID(SUBSTRING_INDEX(score,'-',2),5) AS subject
  4.        ,TRIM(LEADING '0' FROM SUBSTRING_INDEX(score,'-',1)) AS score
  5. FROM (SELECT NAME
  6.       ,MAX(CONCAT(LPAD(score,3,'0'),'-',`subject`,'-',`id`)) AS score
  7. FROM result
  8. GROUP BY 1) t1
复制代码
这个应该可以,
并且要是不要id的话,
  1. SELECT NAME
  2.        ,MID(score,5) AS subject
  3.        ,TRIM(LEADING '0' FROM SUBSTRING_INDEX(score,'-',1)) AS score
  4. FROM (SELECT NAME
  5.       ,MAX(CONCAT(LPAD(score,3,'0'),'-',`subject`)) AS score
  6. FROM result
  7. GROUP BY 1) t1
复制代码
这样就行!

论坛徽章:
0
7 [报告]
发表于 2013-07-17 14:41 |只看该作者
下面这条性能应该还可以,但是不适用susan这种分数都一样的情况:
SELECT NAME,SUBJECT,score FROM result r1 WHERE ( SELECT COUNT(*) FROM result r2 WHERE r2.NAME=r1.NAME AND
                                                 r2.score >= r1.score) <= 1;
下面这条如果索引合适,应该也还行:
(SELECT * FROM result WHERE NAME = 'jack' ORDER BY score LIMIT 1)
UNION ALL
(SELECT * FROM result WHERE NAME = 'jimmy' ORDER BY score LIMIT 1)
UNION ALL
(SELECT * FROM result WHERE NAME = 'john' ORDER BY score LIMIT 1)
UNION ALL
(SELECT * FROM result WHERE NAME = 'tom' ORDER BY score LIMIT 1)
UNION ALL
(SELECT * FROM result WHERE NAME = 'susan' ORDER BY score LIMIT 1);

论坛徽章:
1
2015亚冠之西悉尼流浪者
日期:2015-05-13 11:39:09
8 [报告]
发表于 2013-07-25 18:32 |只看该作者
select id,name,subject,max(score) from (select id,name,subject,score from result order by score  desc ) as t group by name ;

论坛徽章:
0
9 [报告]
发表于 2013-07-26 11:30 |只看该作者
本帖最后由 huowz 于 2013-07-26 11:31 编辑

那这样应该也可以
  1. SELECT NAME
  2.       ,SUBSTRING_INDEX(GROUP_CONCAT(subject ORDER BY score DESC),',',1)
  3.       ,MAX(score)
  4. FROM result
  5. GROUP BY NAME
复制代码
只是不知道哪个效率更高,希望楼主可以测一下。

论坛徽章:
0
10 [报告]
发表于 2013-07-26 13:56 |只看该作者
本帖最后由 q15928 于 2013-08-08 10:50 编辑

回复 9# huowz

如果需要Id的话,这个恐怕不行。。。

@ 姚福坚
的最简单

   
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP