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

时间:2014-05-04 15:30:21

标签: php mysql

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

许多结果行可能有" child"与之关联的行。 IE,他们共享一个包含相同"根号"。

的列

由于我的查询中的分页和限制参数,具有公共根号的行组可以在页面之间拆分,这使得显示变得笨拙。

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

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

有没有人想过如何做到这一点?

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

示例数据:

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

1 个答案:

答案 0 :(得分:1)

limit的分页有几个问题。通常你会计算完整的结果集(这对于MySQL服务器的工作几乎和检索整个集合一样多),并且只要你有limit 2000,50,就会在服务器上放置尽可能多的工作来检索第一个结果集。 2050行并抛出第一个2000。第三个问题是没有其他解决方案像limit那样简单。 ; - )

所以,你可以尝试不同的东西:

  • 将更多页面的更大数据包发送到客户端并在html / javascript / css中进行分页。只需在用户访问最后一页时获取新数据包。在那里你可以使用超过需要获取一行的技巧,所以你看看那行是否与最后一行相同(所以你完全丢弃了这个根数)或者它是否有一个新的根数(所以最后一个根数是完全的)读取)

  • 为用户提供更好的搜索参数 - 没有用户真正完全读取250行,用户通常只搜索特定日期或某个关键字,或根目录的某些属性。一旦用户'分页'几个月或几周,她就知道它在什么时候。这个确实的问题是“页面”大小有时会有很大差异。但是你可以在客户端解决这个问题。

  • MySQL-Server非常乐意进行where date between '2013-12-01' and '2014-01-01'where color='blue' and 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服务器版本使用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) 
 ;

但是现在可能真的很慢。

但是:尝试提供搜索参数以将表格减少到最小值!

非常有趣!