2014-05-03 147 views
2

我在MySQL数据库中有一个新闻表我查询表并在一个PHP页面中显示新闻标题,但现在表格变得越来越大,所以我想将结果分成页面我的意思是显示每个50个新闻标题在一个页面(pagenation)。 我用这个查询带来的消息:如何将MySQL查询结果限制为特定结果?

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查询的最大值和最小值是错误的吗?我应该纠正这些代码中的某些内容吗

+0

LIMIT子句在MySQL手册解释说,这也说明你的形式,所以它说LIMIT的第一个和第二个参数代表什么。 '$ max'在你的情况下是错误的,它总是每页的数字,如此恒定,所以你的情况是50。 https://dev.mysql.com/doc/refman/5.0/en/select.html – hakre

回答

0

如果你有问题正确处理分页,我建议你使用一些正在工作的代码,例如帕格记录类需要三个参数:

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

然后该类将为您生成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()); 

这应该很容易做到这一点。类是这里要点:https://gist.github.com/4469154

+0

非常感谢您参考此类,它非常有帮助 – Basel

0

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

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; 
} 
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你不”需要使任何乘法

+0

-1:该代码有点复杂。可以写得更小。 – hakre

+0

这不是关于代码并发症和优化,而只是使其工作 –

+0

嗯,答案是关于帮助。不要认为这有助于解释为什么代码应该是正确的。而且我并没有谈论太多复杂或优化问题。也许只需将$ max设置为50,然后将min分配给get参数即可。 – hakre

2

LIMIT条款,如docs解释,接受参数偏移计数。所以,如果你想得到,例如,结果从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); 
+0

感谢您的支持关于'$ offset'和'$ count'的信息对我来说是一个很大的问题,但现在我可以理解整个事情了,谢谢 – Basel