【问题标题】:Possible to limit results returned, yet leave 'pagination' to table?可以限制返回的结果,但将“分页”保留在表格中?
【发布时间】:2010-11-16 00:18:56
【问题描述】:

我正在使用 jquery 和 DataTables 插件构建一个 php 站点。我的页面布局与分页工作所需的一样,但在处理大型数据集时,我注意到服务器正在提取所有返回的行,而不是每个“页面”中规定的 10 行(可能更多)限制。

是否可以限制查询结果,但在内存中保留这些结果的 ID 号,以便在点击第 2 页时(或更改结果号)只寻找新数据?

这样做有意义吗?

我只是不想查询一个返回 2000 行的数据库,然后有一个“前端插件”让它看起来像其他结果从一开始就真实地在页面上时被隐藏。

【问题讨论】:

    标签: php jquery mysql datatables


    【解决方案1】:

    SQL 中的 LIMIT 子句有两部分——限制和偏移量。

    获取前 10 行:

    SELECT ... LIMIT 0,10
    

    获取接下来的 10 行:

    SELECT ... LIMIT 10,10
    

    获取接下来的 10 行:

    SELECT ... LIMIT 20,10
    

    只要您每次都对结果集进行排序,您绝对不必(也不想)首先要求数据库向您发送所有 2000 行。

    要同时显示分页,您仍然需要知道有多少总行与您的查询匹配。有两种方法可以处理——

    1) 通过单独的查询请求行数

    SELECT COUNT(*) FROM table WHERE ...
    

    2) 在查询中使用 SQL_CALC_FOUND_ROWS 提示,这将告诉 MySQL 在仅返回您要求的 10 行之前计算与查询匹配的行数。然后发出SELECT FOUND_ROWS() 查询以获得该结果。

    SELECT SQL_CALC_FOUND_ROWS column1, column2 ... LIMIT 0,10
    

    2 更可取,因为它不会为每个页面加载添加额外的查询。

    【讨论】:

    • 我有一点不同意。根据我在几个站点中实现此功能的经验,获取总数的选项 1 实际上更可取。使用 SQL_CALC_FOUND_ROWS 会解决各种 MySQL 错误和怪癖,包括破坏执行 LIMIT 子句带来的任何性能提升。
    • 首先感谢您的帮助。我熟悉 LIMIT 子句,但我正在努力解决的问题是如何实际保留在数据变量的某个时间返回的那些单独的记录,尤其是不需要任何额外的页面加载。 DataTables 插件实际上有服务器端示例,但它们似乎太旧了,并且使用旧的 sql 调用,通过它们进行密码几乎更令人沮丧(更不用说日期时间格式和 json 响应存在问题)。看来我得尝试一下了。
    • 您有两个基本选项。通过一个查询将它们全部提取出来,或者仅在有限制的情况下提取一些。但是您可以使用 jQuery 的 AJAX 工具并在服务器上编写一个脚本,以便您根据需要提取更多数据,这样您就不必重新加载页面。这就是我的脚本通常的工作方式。
    猜你喜欢
    • 2016-03-29
    • 1970-01-01
    • 2019-09-10
    • 1970-01-01
    • 2017-05-02
    • 1970-01-01
    • 2018-06-06
    • 2012-06-08
    • 2016-07-03
    相关资源
    最近更新 更多