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

时间:2014-05-03 11:46:56

标签: php mysql sql

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

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页面的一部分(我如何计算最大值和最小值)

$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查询的最大值和最小值是不对的?我应该更正此代码中的内容吗?

4 个答案:

答案 0 :(得分:2)

docs中所述,LIMIT子句采用偏移计数参数。因此,如果您希望获得201到250之间的结果,则可以使用LIMIT 200, 50。首先将变量$min$max重命名为$offset$count,然后一切都将落实到位。

伪代码:

offset = (requestedPageNumber - 1) * rowsPerPage;
count = rowsPerPage;

PHP代码: (假设页码是从0开始的)

$rowsPerPage  = 50;
$page = empty($_GET['p_n']) ? 0 : $_GET['p_n'];
$offset  = $rowsPerPage * (int) $page;
$news = all_news($offset, $rowsPerPage);

答案 1 :(得分:0)

您需要设置start(这可以通过使用当前页面和每页属性来实现),第二个信息是您想要的结果数量(每页属性再次)。

LIMIT . ($p_n - 1) * $news_per_page .', ' . $news_per_page

所以,在你的脚本中它将是:

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;
}

答案 2 :(得分:0)

正确的代码是:

$news_per_page = 50;
if(!empty($_GET['p_n']))
{
   $p_n = intval($_GET['p_n']);
   $min = ($p_n-1) * $news_per_page;
   $max = $news_per_page;
}
else
{
   $p_n = 1;
   $max = 50; 
   $min = 0;
}
$news = all_news($max,$min);

虽然$ _GET ['p_n']是page_number,但你不需要进行任何乘法

答案 3 :(得分:0)

如果你在处理分页时遇到问题,我建议你使用一些有效的代码,例如一个带有三个参数的分页类:

  1. 当前页面。
  2. 总数。
  3. 每页的商品数量。
  4. 然后该类将为您生成LIMIT子句。例如:

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

    这将输出

    LIMIT 0, 5
    

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

    $pagination->setPage(-2);
    echo $pagination, "\n";
    echo "Current: ",    $pagination->getPage(),
         "; Total: ",    $pagination->getTotalPages(),
         "; Previous: ", $pagination->getPreviousPage(),
         "; Next: ",     $pagination->getNextPage(), 
         "\n";
    

    输出:

    LIMIT 0, 5
    Current: 1; Total: 4; Previous: 1; Next: 2
    

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

    $pagination = new LimitPagination($_GET['p_n'], $totalCount, 50);
    $limit = sprintf("%d, %d", $pagination->getOffset(), $pagination->getCount());
    

    这很容易做到。类在这里是Gist:https://gist.github.com/4469154

相关问题