最近在做学校的数据库作业,因为课本是用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;