最近在做学校的数据库作业,因为课本是用SQL Server实现的,而我是用MySQL,所以出现了一些问题,比如在SQL Server中,获取前百分之几的数据,只需要 top xxx percent即可,而在MySQL中,如果要获取前xxx条数据,则要用 limit xxx ,神奇的地方来了,limit并不支持动态参数,这就很麻烦了,这个问题比较有意思,所以我在此记录下。

这里主要有两个方法:记录行号和使用预处理语句

记录行号

思路比较简单,先查询一遍表,并记录行号

有了行号,再查询一遍,就可以再where语句中设置条件,把前百分之几的数据查询出来了

例:

select t.student_id, t.course_id, t.score
from (
         select a.*, @row_num := @row_num + 1 as row_num
         from student_course a,
              (select @row_num := 0) b
         order by score desc
     ) t
where t.row_num <= (@row_num * 0.15)

使用预处理语句

写起来比较复杂,但是也算比较好懂,大概就是先计算出行数,再处理查询语句

因为limit语句不能使用动态参数,所以需要使用预处理语句

set @stmt := concat('select * from student_course order by student_course.score desc limit ?');
prepare s1 from @stmt;
set @count := (select convert(count(*) * 0.15, signed)
               from student_course);
execute s1 using @count;
deallocate prepare s1;
最后修改:2021 年 11 月 18 日
如果觉得我的文章对你有用,请随意赞赏