【问题标题】:retrieving rows in reverse direction from table using sql limit使用sql限制从表中反向检索行
【发布时间】:2011-11-26 22:25:01
【问题描述】:

我在 MySQL 中使用 SQL 限制 实现分页,需要 db.Records 来获取

从最后一行向后检索。表中有几千条记录

我想一次检索 500 条记录以显示在一个页面中。

SELECT * FROM tbl_name ORDER BY some_col DESC

将检索所有记录。

但我不想要所有记录,因为它们有数千个。

如果我使用

SELECT * FROM tbl_name ORDER BY some_col DESC LIMIT 500

它将按降序返回最后 500 条记录。

但我找不到从第一个块离开的点开始反向检索下一个 500 块的方法。

【问题讨论】:

标签: mysql sql pagination


【解决方案1】:
SELECT
    <column list since I never use *>
FROM
    My_Table
ORDER BY
    some_column DESC
LIMIT 500, 500

编辑:关于您对罗伯特的回答的评论...性能会随着偏移量的增大而下降,但明显下降的点通常很大。从我在一两天前在寻呼时给出的类似问题的答案中:

我强烈认为 UI 绝不应允许用户 检索一组记录,让它们转到(例如)第 5000 页。 对于人类大脑来说,这简直是太多数据了 一次,应该需要进一步过滤。也许让他们看到 前 100 页(或其他数字),否则他们必须 更好地约束结果。只是我的意见。

【讨论】:

  • 当我们运行“select * from table_name where 'some condition'”时,下面哪个语句正确? ...来自“选择”的所有记录首先进入我们/客户端计算机的主内存,然后在那里应用“where”子句以返回选定的行。 OR 'where' 直接应用于数据库服务器,只有满足条件的行才会返回给客户端
  • 服务器将只返回查询输出的行。客户端不应该自己进行任何过滤。
【解决方案2】:

答案与您的假设数字令人困惑,所以让我自己做一个:

假设我们要显示第 3 页,每页有 10 条记录。我们要偏移 20 条记录(第 1 页和第 2 页上的记录),然后找到 10 条记录。格式为:

> SELECT * FROM tbl_name ORDER BY some_col DESC LIMIT 20, 10;

换句话说,就是

LIMIT <offset>, <max results>

阅读更多:http://php.about.com/od/mysqlcommands/g/Limit_sql.htm

【讨论】:

  • 我有几千条记录,我在某处读到,当我们运行像“select * from table_name limit 1000000, 100”这样的查询时,其中“偏移”非常大,使用效率低下因为这仍然会遍历前 1000000 行以返回接下来的 100 行。所以我想在使用“limit”子句时避免偏移。
  • @brightness 只要您在 some_col 上有索引,这不是问题。使用索引,列在 SQL 的头脑中是“排序的”。因此,返回第 1-100 行或第 1000001-1000100 行的难度相同。它将简单地通过索引调用二进制搜索,这将花费 log(N) 时间。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-28
  • 2021-03-22
相关资源
最近更新 更多