我有一个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
答案 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)
;
但是现在可能真的很慢。
但是:尝试提供搜索参数以将表格减少到最小值!
非常有趣!