【问题标题】:ensuring a minimum number of rows returned确保返回的最小行数
【发布时间】:2012-06-18 17:51:55
【问题描述】:

我正在用 PHP 和 MySQL 数据库制作一个简单的留言板。我使用“LIMIT”操作将消息限制为每页 20 条。

我的 URL 示例是:http://www.example.com/?page=1

如果未指定页面,则默认为 1。正如我之前提到的,每页有 20 个限制,但是如果超出可能的 30 个并且我希望查看第 2 页,我只会得到10 个结果。在这种情况下,我的查询的 LIMIT 部分类似于 LIMIT 20,40 - 在这种情况下如何确保返回 20?

我希望尽可能多地将其保留在 MySQL 端。

编辑: 澄清一下,如果我在第 2 页,我将获取第 20-30 行,但这只有 10 行,所以我希望选择 10-30。

编辑: 我目前正在使用以下查询:

我的查询:

SELECT MOD(COUNT(`ID`),20) AS lmt WHERE `threadID`=2;
SELECT * FROM `msg_messages` WHERE `threadID`=2 LIMIT 20-(20-lmt) , 40-(20-lmt) ;

有 30 条记录匹配。

【问题讨论】:

  • 确定要这样做吗?这是非标准的,老实说,这听起来非常令人困惑。为什么需要这个?
  • 你能颠倒顺序,取前 20 个吗?
  • 在链接传递开始和结束参数http://www.example.com/?page=1,start=20,end=40
  • 如果我理解这个问题,您基本上是想从结果的结束而不是开始开始分页?因此,如果您总共有 30 个结果,每页 20 个,那么第 1 页将有 10 个结果,而第 2 页将有 20 个结果?这个问题可能会更清楚。

标签: php mysql database mysqli


【解决方案1】:

我不确定是否真正理解了这个问题,但如果我理解了,我认为最好的做法是防止用户转到没有结果的页面。为此,即使您使用SQL_CALC_FOUND_ROWS 使用“LIMIT”子句,您也可以轻松检查总共有多少行。

例如你可以这样做:

Select SQL_CALC_FOUND_ROWS * from blog_posts where balblabla...

然后你必须像这样运行另一个查询:

Select FOUND_ROWS() as posts_count

它将很快返回总行数。有了这个结果并知道当前页面,您可以决定是否向用户显示下一个/上一个链接。

【讨论】:

  • Simon,我尝试了你的建议,但是我只得到了返回的第一个查询的结果?
  • 您必须使用“Select FOUND_ROWS() as posts_count”运行另一个查询才能获得总行数,您尝试过吗?
  • 是的,我试过了。我可以使用 Alex 的回复获取行数,但是我不能使用返回值来获取任何结果。
【解决方案2】:

你可以这样做:

SELECT COUNT(*)/20 AS pages FROM tbl;

..获取最大页数,然后确定是否要保留部分集并相应地调整分页查询。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-06-16
    • 1970-01-01
    • 2017-07-23
    • 2012-12-15
    • 1970-01-01
    • 1970-01-01
    • 2011-05-26
    • 1970-01-01
    相关资源
    最近更新 更多