首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何将MySQL查询结果限制为特定结果?

问如何将MySQL查询结果限制为特定结果?
EN

Stack Overflow用户
提问于 2014-05-03 11:46:56
回答 4查看 377关注 0票数 2

我在MySQL数据库中有一个新闻表,我查询这个表并在一个PHP页面中显示新闻标题,但是现在这个表越来越大,所以我想将结果分成几页,我的意思是在一页中显示每50个新闻标题(分页)。我使用这个查询带来了以下消息:

代码语言:javascript
复制
SELECT news.*, categories.category, users.username 
FROM news INNER JOIN 
     users on news.user_id = users.id INNER JOIN 
     categories on categories.id = news.category_id 
order by news.timestamp DESC 
limit $min,$max

这是PHP页面的一部分(我是如何计算最大和最小的)

代码语言:javascript
复制
$news_per_page = 50;
if(!empty($_GET['p_n']))
{
    $p_n = $_GET['p_n'];
    $max = $news_per_page*$p_n; 
    $min = ($max - $news_per_page); 
}
else
{
    $p_n = 1;
    $max = 50; 
    $min = 0;
}
$news = all_news($max,$min);

当我通过限制时,sql给了我错误的结果,我不知道原因。用这种方式指定sql查询的最大值和最小值是错误的吗?我应该纠正这段代码中的某些内容吗?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2014-05-03 11:59:27

如果您在正确处理分页时遇到问题,我建议您使用一些正在工作的代码,例如,使用三个参数的分页类:

  1. 当前页面。
  2. 总人数。
  3. 每页的项目数。

然后该类将为您生成LIMIT子句。示例:

代码语言:javascript
复制
$pageNumber = 1;
$totalCount = 17;
$perPage    = 5;

$pagination = new LimitPagination($pageNumber, $totalCount, $perPage);
echo $pagination, "\n";

这将输出

代码语言:javascript
复制
LIMIT 0, 5

因为你在第一页。这样一个类也可以过滤掉你在这里遇到的问题,例如设置为一个负面的页面--只是自动的。此外,它还可以提供大量额外的数据,例如下一页和前一页、当前页、总页数,如果是第一页或最后一页,或者不是:

代码语言:javascript
复制
$pagination->setPage(-2);
echo $pagination, "\n";
echo "Current: ",    $pagination->getPage(),
     "; Total: ",    $pagination->getTotalPages(),
     "; Previous: ", $pagination->getPreviousPage(),
     "; Next: ",     $pagination->getNextPage(), 
     "\n";

输出:

代码语言:javascript
复制
LIMIT 0, 5
Current: 1; Total: 4; Previous: 1; Next: 2

这样就很容易与不同的代码集成,包括您的代码:

代码语言:javascript
复制
$pagination = new LimitPagination($_GET['p_n'], $totalCount, 50);
$limit = sprintf("%d, %d", $pagination->getOffset(), $pagination->getCount());

这应该很容易做到。类以Gist:https://gist.github.com/4469154的形式出现

票数 0
EN

Stack Overflow用户

发布于 2014-05-03 12:05:04

正如在LIMIT中所解释的那样,文档子句接受参数、偏移量和count。因此,如果您想得到,例如,从201到250的结果,您可以使用LIMIT 200, 50。首先,将变量$min和$max重命名为$offset和$count,然后一切都就位。

伪码:

代码语言:javascript
复制
offset = (requestedPageNumber - 1) * rowsPerPage;
count = rowsPerPage;

PHP代码:(假设页码为0)

代码语言:javascript
复制
$rowsPerPage  = 50;
$page = empty($_GET['p_n']) ? 0 : $_GET['p_n'];
$offset  = $rowsPerPage * (int) $page;
$news = all_news($offset, $rowsPerPage);
票数 2
EN

Stack Overflow用户

发布于 2014-05-03 11:55:56

您需要设置start (这可以通过使用当前页和每个页面属性来实现),第二个信息是您需要多少结果(同样是每个页面属性)。

代码语言:javascript
复制
LIMIT . ($p_n - 1) * $news_per_page .', ' . $news_per_page

因此,在您的脚本中,它将是:

代码语言:javascript
复制
if(!empty($_GET['p_n']))
{
    // You need to protect your variables for SQL injection. For numbers (int) or integer() function it is enough.
    $p_n = (int) $_GET['p_n'];
    $max = (int) $news_per_page; 
    $min = (int) ($p_n - 1) * $news_per_page; 
}
else
{
    $p_n = 1;
    $max = 50; 
    $min = 0;
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23443997

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档