论坛首页 综合技术论坛

一道淘宝的考察sql语句的面试题

浏览 55203 次
精华帖 (0) :: 良好帖 (3) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2011-05-13  
tfwin2 写道
isaacfu_454 写道

 

 select * from t_stu a where 5>(select count(*) FROM t_stu where gender=a.gender AND grade>a.grade) order by a.grade desc
 


这位的效果更好!


就是换种思维方式,先算比某个成绩大的有几个,只要找出比他大的数小于5就可以了,只要知道这个思维,你不这样写也可以写出来,这样写看起来比较难懂点就是了

0 请登录后投票
   发表时间:2011-05-13   最后修改:2011-05-13
一、先找出每种gender的第N个的grade的值minGrade
二、再查询相同gender中grade>= minGrade的记录

SELECT  t.`name`, t.`gender`, t.`grade` FROM `t_stu` AS t,
(SELECT u2.gender,MIN(u2.grade) AS minValue FROM
(SELECT u1.`gender`, u1.`grade` FROM `t_stu` AS u1 WHERE u1.gender=1 ORDER BY u1.grade DESC LIMIT 5) AS u2
GROUP BY u2.gender
) AS tb1,
(SELECT u2.gender,MIN(u2.grade) AS minValue FROM
(SELECT u1.`gender`, u1.`grade` FROM `t_stu` AS u1 WHERE u1.gender=0 ORDER BY u1.grade DESC LIMIT 5) AS u2
GROUP BY u2.gender
) AS tb2
WHERE (t.gender=tb1.gender AND t.grade>=tb1.minValue) OR (t.gender=tb2.gender AND t.grade>=tb2.minValue)
ORDER BY t.gender,t.grade DESC
0 请登录后投票
   发表时间:2011-05-13   最后修改:2011-05-13
MYSQL,之前已经发表一个查询,不过没人回应,在来一个
SELECT * FROM `t_stu` WHERE grade>=IFNULL((SELECT grade FROM `t_stu` WHERE gender=0 order BY grade DESC LIMIT 4,1),0) AND gender=0
UNION ALL
SELECT * FROM `t_stu` WHERE grade>=IFNULL((SELECT grade FROM `t_stu` WHERE gender=1 order BY grade DESC LIMIT 4,1),0) AND gender=1

---------------------------------------------------------------------
简化
SELECT * FROM `t_stu` a WHERE grade>=IFNULL((SELECT grade FROM `t_stu` WHERE gender=a.gender order BY grade DESC LIMIT 4,1),0)

不过还是觉得下面的好些
---------------------------------------------------------
附上之前的SQl
SELECT a.* FROM t_stu a INNER JOIN ((SELECT GROUP_CONCAT(Id) AS Id FROM t_stu where gender=1 GROUP BY grade DESC LIMIT 5) union all (SELECT GROUP_CONCAT(Id) AS Id FROM t_stu where gender=0 GROUP BY grade DESC LIMIT 5)) b ON FIND_IN_SET(a.id,b.Id)>0 ORDER BY grade DESC
0 请登录后投票
   发表时间:2011-05-14  
我认为结果 应该小于等于 5行
最后显示的结果应该是这样的:
    姓名 性别 成绩  姓名 性别 成绩
1  女一  女   99   男一  男   98
2  女二  女   98   男二  男   97
3  女三  女   97   男三  男   96
4  女四  女   96   男四  男   95
5                  男五  男   94


这样才能给取结果时比较方便

而这种显示方式
    姓名 性别 成绩 
1  女一  女   99  
2  女二  女   98  
3  女三  女   97  
4  女四  女   96  
5  男一  男   98
6  男二  男   97
7  男三  男   96
8  男四  男   95
9  男五  男   94

在取值的时候会出现问题,后续要增加程序的判断(尤其是当其中 比如 女生根本不足五人的时候)
我觉得 这条SQL题目 应该考的就是这方面的考虑。之前有附上 sql。不知是否想多了。
0 请登录后投票
   发表时间:2011-05-15  
isaacfu_454 写道

 

 select * from t_stu a where 5>(select count(*) FROM t_stu where gender=a.gender AND grade>a.grade) order by a.grade desc
 

++

高手

0 请登录后投票
   发表时间:2011-05-16  
引用
select * from t_stu a where 5>(select count(*) FROM t_stu where gender=a.gender AND grade>a.grade) order by a.grade desc


这个效率差的.
还是用union all好
0 请登录后投票
   发表时间:2011-05-17  
..好复杂,从来没有尝试过,看来跟不上这里步伐
0 请登录后投票
   发表时间:2011-05-17  
select * from t_stu a where 5>(select count(*) FROM t_stu where gender=a.gender AND grade>a.grade) order by a.grade desc

刚看到这个sql时还觉得很新颖   思路很特别

我新建了一个张表 并插入了 26万多行数据

结果用 union all 一秒不到就出结果

但 上面的那个sql 过了十五分钟还没出结果  果断中断执行。。。
0 请登录后投票
   发表时间:2011-05-17  
SELECT * FROM(SELECT * FROM T_STU WHERE GENDER=1 ORDER BY GRADE DESC) where rownum<=5 
UNION  
SELECT * FROM (SELECT * FROM T_STU WHERE GENDER=0 ORDER BY GRADE DESC )where rownum<=5;

正解
0 请登录后投票
   发表时间:2011-05-17  
grantliping 写道
SELECT * FROM(SELECT * FROM T_STU WHERE GENDER=1 ORDER BY GRADE DESC) where rownum<=5 
UNION  
SELECT * FROM (SELECT * FROM T_STU WHERE GENDER=0 ORDER BY GRADE DESC )where rownum<=5;

正解



莫非也是第一次发帖 。。。。
0 请登录后投票
论坛首页 综合技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics