我想知道是否有一种方法可以从MySQL查询中获得结果的数量,同时限制结果。
分页的工作方式(据我所知),首先我这样做
query = SELECT COUNT(*) FROM `table` WHERE `some_condition`
在获得查询(Num_rows)之后,我就得到了结果的数量。但为了实际限制我的结果,我必须执行第二个查询,如下所示:
query2 = SELECT COUNT(*) FROM `table` WHERE `some_condition` LIMIT 0, 10
我的问题是:有没有办法既检索给定结果的总数,又限制在单个查询中返回的结果?或者任何更有效的方式来做这件事。谢谢!
发布于 2009-05-04 02:37:15
不,这是许多想要分页的应用程序必须做的事情。它是可靠和防弹的,尽管它进行了两次查询。但是您可以将计数缓存几秒钟,这将会有很大帮助。
另一种方法是使用SQL_CALC_FOUND_ROWS
子句,然后调用SELECT FOUND_ROWS()
。除了必须将FOUND_ROWS()
调用放在后面的事实之外,这还有一个问题:a bug in MySQL,这会影响ORDER BY
查询,使其在大型表上比两个查询的幼稚方法慢得多。
发布于 2010-07-24 19:14:51
我几乎从不做两个查询。
只需返回超过所需的一行,在页面上仅显示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.
您的查询应首先以最相关的顺序返回。很有可能,大多数人都不会关心翻到第236页的412页。
当你在谷歌上搜索,结果不在第一页时,你很可能会进入第二页,而不是第九页。
发布于 2011-09-08 13:19:16
另一种避免双重查询的方法是首先使用LIMIT子句获取当前页面的所有行,然后在检索到最大行数的情况下只执行第二次COUNT(*)查询。
在许多应用程序中,最有可能的结果是所有结果都可以放在一页上,并且必须进行分页是一个例外,而不是常态。在这些情况下,第一个查询将不会检索最大数量的结果。
例如,堆栈溢出问题的答案很少会出现在第二页上。对答案的评论很少会超过显示所有答案所需的5条左右的限制。
因此,在这些应用程序中,您只需先执行一个具有限制的查询,然后只要未达到该限制,您就可以确切地知道有多少行,而无需执行第二个COUNT(*)查询-这应该涵盖了大多数情况。
https://stackoverflow.com/questions/818567
复制相似问题