有一个学校的奖学金表 school(classid,studentid,score) 返回每个班级成绩排名前20%的学生全部信息
如  
(1,1,100),
(1,2,99),
(1,3,97),
(1,4,96),
(1,5,94)
(2,1,100),
(2,2,99),
(2,3,97),
(2,4,96),
(2,5,94)返回(1,1,100),(2,1,100)
不用存储过程,单独mysqlsql语句

解决方案 »

  1.   

    select * 
    from school s
    where (select count(*)*0.2 from school where classid=s.classid)>(select count(*) from school where classid=s.classid and score>s.score)
      

  2.   

    没有像sqlserver top percent的语句
      

  3.   

    应该比狼头的快一点,我的测试数据:
    classid, studentid为主键,classid, score上建索引
    65536条记录,1600个班级,选出了12504条记录,耗时0.172sSELECT s.*
      FROM school s,
    (
    SELECT classid,
           count(*) * 0.2 AS maxPos,
           group_concat(studentid ORDER BY score DESC) AS list
      FROM school
     GROUP BY classid
    ) x
    WHERE s.classid = x.classid
      AND FIND_IN_SET(studentid, list) <= maxPos
    ORDER BY classid, score DESC;
      

  4.   

    group_concat函数把同组的studentid,按照score desc的顺序,用逗号分隔连接成一个string
    find_in_set函数,查找studentid在逗号分隔的字符串中是否存在,存在的话,返回是第几个