2014-05-03 208 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