为了账号安全,请及时绑定邮箱和手机立即绑定

MySQL分页没有双重查询?

MySQL分页没有双重查询?

陪伴而非守候 2019-10-08 15:23:19
我想知道是否有一种方法可以从MySQL查询中获取结果数量,并同时限制结果。分页的工作方式(据我了解),首先我要做的是query = SELECT COUNT(*) FROM `table` WHERE `some_condition`得到num_rows(query)之后,我得到了结果数。但是为了实际限制结果,我必须执行第二个查询,例如:query2 = SELECT COUNT(*) FROM `table` WHERE `some_condition` LIMIT 0, 10我的问题:无论是要检索要给出的结果总数,还是要限制单个查询中返回的结果?或更有效的方法。谢谢!
查看完整描述

3 回答

?
手掌心

TA贡献1942条经验 获得超3个赞

不,这就是要分页的应用程序必须要做的事。它是可靠且防弹的,尽管它使查询两次。但是您可以将计数缓存几秒钟,这会很有帮助。


另一种方法是使用SQL_CALC_FOUND_ROWS子句,然后调用SELECT FOUND_ROWS()。除了必须FOUND_ROWS()随后进行调用之外,还有一个问题:MySQL中有一个bug,它会影响ORDER BY查询,使其在大表上比两个查询的幼稚方法慢得多。


查看完整回答
反对 回复 2019-10-08
?
胡子哥哥

TA贡献1825条经验 获得超6个赞

我几乎从来没有做过两次查询。


只需返回比需要多的一行,仅在页面上显示10,如果显示的行多,则显示“下一步”按钮。


SELECT x, y, z FROM `table` WHERE `some_condition` LIMIT 0, 11

// iterate through and display 10 rows.


// if there were 11 rows, display a "Next" button.

您的查询应以最相关的顺序返回。通常,大多数人都不会在意412中的第236页。


当您进行Google搜索时,结果不在第一页上,您可能会转到第二页,而不是第9页。


查看完整回答
反对 回复 2019-10-08
?
Smart猫小萌

TA贡献1911条经验 获得超7个赞

避免重复查询的另一种方法是,首先使用LIMIT子句获取当前页面的所有行,然后,如果检索到最大行数,则仅执行第二个COUNT(*)查询。


在许多应用程序中,最可能的结果是所有结果都适合一页,并且必须进行分页是一种例外,而不是常规。在这种情况下,第一个查询将不会检索最大数量的结果。


例如,关于stackoverflow问题的答案很少会溅到第二页上。对答案的评论很少溢出到5个左右才能显示全部。


因此,在这些应用程序中,您只需简单地先使用LIMIT进行查询,然后只要没有达到该限制,就可以确切知道有多少行而无需执行第二个COUNT(*)查询-这应该涵盖大多数情况。


查看完整回答
反对 回复 2019-10-08
  • 3 回答
  • 0 关注
  • 526 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信