供讨论的示例表
create table t_users (id int auto_increment primary key, username varchar(100));
insert t_users(username) values
('jim'),('bob'),('john'),('tim'),('tom'),
('mary'),('elise'),('karl'),('karla'),('bob'),
('jack'),('jacky'),('jon'),('tobias'),('peter');
显示用户所在页面的查询,而不是专门将用户放在页面顶部(这会容易得多)
select username, id
from
(select count(*) pos
from t_users
where username <= 'tobias') pos,
(select @row:=@row+1 row, u.*
from (select @row:=0) initvars, t_users u
order by u.username, u.id) numbered
where floor((numbered.row + 3)/4) = floor((pos.pos+3)/4);
注意事项:
- 这里的页面大小是4,数字3是页面大小减去1的结果
- 刚刚登录的用户的用户名是'tobias',在第一个子查询中使用
- ORDER BY 子句最好有一个索引(在这种情况下是用户名)
- 这将导致表扫描对最后一个子查询进行完全行号