Php 在页面之间拆分公用行时调整限制?

Php 在页面之间拆分公用行时调整限制?,php,mysql,Php,Mysql,我有一个来自MYSQL的结果集,我正在使用PHP在分页场景中显示它。(上/下链接) 许多结果行可能有与其关联的“子”行。也就是说,它们共享一列,其中包含相同的“根编号” 由于我的查询中的分页和限制参数,那些具有公共根编号的行组可以在页面之间拆分,这使得显示很尴尬 我需要查询将根编号列考虑在内,而不是将这些子行拆分到第二页。相反,它应该继续并包括在同一页上共享该根编号的所有行。在我看来,为了实现这一点,如果select中的最后一行有其他具有相同根编号的行,则查询将考虑根编号,并向上调整限制 似乎也

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

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

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

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

似乎也可以利用偏移量值来实现所需的结果,但我不确定如何在运行中做到这一点

有人想过如何做到这一点吗

SELECT * FROM (`tablename`) LIMIT 3600, 100
示例数据:

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

使用
限制进行分页有几个问题。通常情况下,计算完整的结果集(MySQL服务器所需的工作量几乎与检索整个结果集所需的工作量相同),一旦您有了
limit 2000,50
,服务器上的工作量就相当于检索前2050行并丢弃前2000行。第三个问题是,没有比
限制更容易的解决方案了

因此,您可以尝试不同的方法:

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

  • 为用户提供更好的搜索参数-没有用户真正完整地阅读250行,用户通常只搜索某个日期、某个关键字或根的某些属性。只要用户在几个月或几个星期内“分页”,她就知道这是在什么时候。这确实存在有时“页面”大小非常不同的问题。但是你可以在客户机上解决这个问题

  • MySQL服务器非常乐意进行搜索,比如
    where date介于'2013-12-01'和'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服务器版本使用
中的索引(子查询)
(尝试解释),您也可以使用更好的版本

 /* TRY EXPLAIN AND BEWARE OF FULL TABLE SCAN!*/ 
 select t.* from table_name where rootnumber in 
 ( select rootnumber from table_name limit 3600, 50) 
 ;
但现在这可能真的很慢

但是:尝试提供搜索参数,以将桌面漫游减少到绝对最小


太有趣了

请显示您的查询和数据示例。完成。很抱歉忽略了这一点。结果的分页格式是应用程序固有的。它的工作原理类似于老式的电话簿,用户希望数据以这种方式呈现。(我知道,我知道。电话簿已经过时了。我并不反对,但这是一个我必须至少在短期内支持的遗留应用程序。)我对所使用的框架没有更深入的了解,但也许你只需要在查询和结果集请求之间进行干预。如果可以将limit参数作为额外数据获取,那么可以尝试编写一个缓冲区类,其行为类似于db_resultset(或在那里使用的任何东西),但在redis中存储更大的块,并给出过滤后的行。但这也要注意不要被误解为“不再争吵”。