锁定老帖子 主题:一道淘宝的考察sql语句的面试题
精华帖 (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
|
|
返回顶楼 | |
发表时间: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 |
|
返回顶楼 | |
发表时间: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 |
|
返回顶楼 | |
发表时间: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。不知是否想多了。 |
|
返回顶楼 | |
发表时间: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 ++ 高手 |
|
返回顶楼 | |
发表时间: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好 |
|
返回顶楼 | |
发表时间:2011-05-17
..好复杂,从来没有尝试过,看来跟不上这里步伐
|
|
返回顶楼 | |
发表时间: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 过了十五分钟还没出结果 果断中断执行。。。 |
|
返回顶楼 | |
发表时间: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; 正解 |
|
返回顶楼 | |
发表时间: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; 正解 莫非也是第一次发帖 。。。。 |
|
返回顶楼 | |