php - 调整页面之间拆分公共(public)行的限制?

标签 php mysql

我有一个来自 MYSQL 的结果集,我正在使用 PHP 在分页场景中显示该结果集。 (上一个/下一个链接)

许多结果行可能有与其关联的“子”行。 IE 中,它们共享包含相同“根号”的列。

由于查询中的分页和限制参数,具有公共(public)根编号的行组可以在页面之间拆分,这使得显示很尴尬。

我需要查询考虑根号列,而不是将这些子行拆分到第二页。相反,它应该继续并将在同一页面上共享该根编号的所有行包含在一起。在我看来,为了实现这一点,查询将考虑根号,如果选择中的最后一行具有具有相同根号的其他行,则向上调整 LIMIT。

似乎也可以利用偏移值来实现所需的结果,但我不确定如何即时做到这一点。

有人知道如何实现这一目标吗?

SELECT * FROM (`tablename`) LIMIT 3600, 100

示例数据:

id              name                  rootnumber
-------------------------------------------------
1               Joe                   789
2               Susan                 789
3               Bill                  789
4               Peter                 123

最佳答案

使用limit进行分页有几个问题。通常,您会计算完整的结果集(这对 MySQL 服务器来说几乎需要与检索整个结果集一样多的工作),并且一旦您达到 limit 2000,50,您就投入了尽可能多的工作服务器检索前 2050 行并丢弃前 2000 行。第三个问题是没有其他解决方案比limit更简单。 ;-)

所以,你可以尝试不同的事情:

  • 向客户端发送多个页面的较大数据包,并在html/javascript/css中进行分页。当用户到达这些页面的最后一个时,只需获取一个新数据包即可。在那里,您可以使用获取比需要的多一行的技巧,这样您就可以看到该行是否与最后一行的根号相同(因此您完全丢弃该根号),或者它是否有一个新的根号(因此最后一个根号完全是阅读)

  • 为用户提供更好的搜索参数 - 没有用户真正完整地阅读 250 行,用户通常只是搜索某个日期或某个关键字,或根的某些属性。一旦用户“翻页”了几个月或几周,她就知道现在是什么时间了。这确实有时会出现“页面”大小差异很大的问题。但您可以在客户端中修复该问题。

  • MySQL 服务器非常乐意进行搜索,例如 where date between '2013-12-01' and '2014-01-01'where color= 'blue' 和 customer.sex='f',它的魔力和索引就在那里工作。比“限制 2000、50”要好得多。

工作,这并不容易,但是如果您足够好,您可以为客户找到更好的解决方案,因为他们并不真正喜欢阅读之间的所有内容。

编辑: 对此有一些技术解决方案。当条目具有相同的根编号时,您将它们显示在一起,看起来就像您对它们进行了排序。因此,在之前的查询中(我们确实希望您的 MySQL 服务器具有 Sado 风格并喜欢这一点)并仅获取根号:

 select t.* from tablename as t
 inner join 
 (
      select rootnumber from tablename limit 3600, 50  # you put in your sort her, do you?
 ) as mt on mt.rootnumber = t.rootnumber;

一旦您的 MySQL Server 版本使用 where in (subquery) 上的索引(尝试解释),您也可以使用更好的版本

 /* TRY EXPLAIN AND BEWARE OF FULL TABLE SCAN!*/ 
 select t.* from table_name where rootnumber in 
 ( select rootnumber from table_name limit 3600, 50) 
 ;

但现在可能真的很慢。

但是:尝试提供搜索参数以将走台次数减少到绝对最低限度!

非常有趣!

关于php - 调整页面之间拆分公共(public)行的限制?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23458015/

相关文章:

php - 使用 php 从 for 循环创建变量并将其插入到 mysql 中

php - 将 datetimepicker 插件格式化为 jQuery datepicker 以在 MySQL 中使用

php - 调用未定义的方法 DOMNodeList::getElementsByTagName() PHP

php - 尝试从多维数组中提取值以在 SQL 语句中使用

mysql - 设置正确的表结构以防止重复条目

mysql - SQL:没有年份的两个日期之间的位置?

php - laravel 如何检查 session 变量是否为空

转义文字 <?php 和 <?在 PHP 脚本中

mysql - 返回到第一个数字的子串

mysql - 查找候选键/ super 键