【问题标题】:How to find which page something starts on in a numbered pagination of sorted results?如何在排序结果的编号分页中找到某页从哪个页面开始?
【发布时间】:2013-05-07 05:12:55
【问题描述】:

/users/1 是分页结果的第一页。它运行一个查询:

SELECT * FROM users ORDER BY surname, id LIMIT 0, 100;

/users/2 调整生成的 SQL。 LIMIT 100, 100 显示第二页分页结果等。

我想在这些相同的分页结果按姓氏排序时实现 A-Z 链接;按日期排序时基于年份的链接;当按整数字段排序时,基于数字的链接。你明白了。

例如:URL /users/A 将重定向到 /users/1,但是我如何有效地确定 /users/B 应该重定向到哪个页面。

我知道/users/B 可以运行“过滤器”查询以提取姓氏以 B 开头的用户并在页面上显示。但是我想避免创建另一个页面,因此我想要一个重定向。

我还可以遍历SELECT surname FROM users ORDER BY surname 的结果,计算 B 和其他字母的开始位置,并将开始位置除以每页的结果 (100),但效率低下。我认为这需要一些聪明的 SQL。我使用 MySQL。

使用 Postgres 的类似问题: Pagination: Find out which page an item is on (given primary key & sorting order)

【问题讨论】:

  • 小心,您的第一个 SQL 将结果递增 100。第一个应该是 LIMIT 0, 100,第二个应该是 LIMIT 100, 100,第三个应该是 LIMIT 200, 100
  • 谢谢,我更正了偏移量。

标签: mysql sql


【解决方案1】:

这样的事情怎么样:

select Page
from (
    select substring(Surname, 1, 1) as SurnameFirstLetter, min(page) as Page
    from (
        select Surname, ceiling((@row := @row + 1) / 100) as page
        from users, (select @row := 0) r
        order by Surname
    ) t
    group by substring(Surname, 1, 1)
) t
where SurnameFirstLetter = 'B'

【讨论】:

    【解决方案2】:

    您可以使用select count(*) from users where surname<'Current' 获取当前位置。

    【讨论】:

    猜你喜欢
    • 2012-02-23
    • 2012-09-29
    • 2010-11-24
    • 2013-09-12
    • 2018-11-23
    • 2012-06-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多