2011-10-28 13 views
0

データベース出力のソートを変更するボタンを作成したいと思います。 ページングクラスを使用して1つのテーブルを検索し、結果を出力します。昇順または降順の列で結果を簡単にORDERできます。2ページの結果をページ番号付きでソートする(PHP、mysql)

$sql = "SELECT id, name, address FROM restaurant WHERE accepted = '1' ORDER BY id DESC"; 
$pagination = new Pagination(); 
$pagination->page = $_GET['page']; 
$pagination->perPage = 10; 
$pagination->classNormal = 'someClass'; 
$pagination->classSelected = 'someClass2'; 
$pagination->sql($sql); 

whileループでは、私はそれらの結果と別のmysql aueryを持っています。今

while($row = $pagination->getRows()) { 
$sql2 = "SELECT COUNT(DISTINCT prod_name) AS nr_of_prod FROM menu WHERE id = '".$row['id']."'" ;     
$do1->doQuery($sql2); 
$row_amount = $do1->getRows(); 
//... and here is some data output 

は、問題はどのようにすることができますI(nr_of_prodによってexampple用)この2番目のクエリからの列ですべてのページング結果の並べ替え/オーダー?

答えて

2

は最初の2番目のクエリを右置き:また

SELECT id, name, address, 
     (SELECT COUNT(DISTINCT prod_name) nr_of_prod 
     FROM menu 
     WHERE menu.id = restaurant.id 
     ) nr_of_prod 
FROM restaurant 
WHERE accepted = '1' 
ORDER BY id DESC 

を、なぜあなたは、いくつかのページネーションクラスを使用しての代わりに、MySQLのLIMITを使用していますか?

ます。また、このようにそれを書くことができます(両方をプロファイルして選ぶには、最適なものは、テーブルの相対的なサイズに依存):

SELECT id, name, address, nr_of_prod 
FROM restaurant JOIN 
    (SELECT id, COUNT(DISTINCT prod_name) nr_of_prod 
     FROM menu 
     GROUP BY id 
    ) nr_of_prod USING (id) 
WHERE accepted = '1' 
ORDER BY id DESC 
+0

ありがとうございます!魅力のように働いています:)このソリューションをさらに多くのテーブルに使用できますか?つまり、必要なだけ複数の「選択」を1つのクエリで使用できますか? – gordonek

+0

@gordonekはい。すべてが「適合」するわけではありませんが、確かに、単一の値(つまり値のリストではない)を返すものがあれば動作します。 – Ariel

-2

が、私は他のウェブサイトからこのページネーションコードを拾い、それは素晴らしい実行されます私のページに... NOT:これは私のコードではなく、私はそのように主張しません。

/* 
    Place code to connect to your DB here. 
*/ 
include('config.php'); // include your code to connect to DB. 

$tbl_name="";  //your table name 
// How many adjacent pages should be shown on each side? 
$adjacents = 3; 

/* 
    First get total number of rows in data table. 
    If you have a WHERE clause in your query, make sure you mirror it here. 
*/ 
$query = "SELECT COUNT(*) as num FROM $tbl_name"; 
$total_pages = mysql_fetch_array(mysql_query($query)); 
$total_pages = $total_pages[num]; 

/* Setup vars for query. */ 
$targetpage = "filename.php"; //your file name (the name of this file) 
$limit = 30;        //how many items to show per page 
$page = $_GET['page']; 
if($page) 
    $start = ($page - 1) * $limit;   //first item to display on this page 
else 
    $start = 0;        //if no page var is given, set start to 0 

/* Get data. */ 
$sql = "SELECT column_name FROM $tbl_name LIMIT $start, $limit"; 
$result = mysql_query($sql); 

/* Setup page vars for display. */ 
if ($page == 0) $page = 1;     //if no page var is given, default to 1. 
$prev = $page - 1;       //previous page is page - 1 
$next = $page + 1;       //next page is page + 1 
$lastpage = ceil($total_pages/$limit);  //lastpage is = total pages/items per page, rounded up. 
$lpm1 = $lastpage - 1;      //last page minus 1 

/* 
    Now we apply our rules and draw the pagination object. 
    We're actually saving the code to a variable in case we want to draw it more than once. 
*/ 
$pagination = ""; 
if($lastpage > 1) 
{ 
    $pagination .= "<div class=\"pagination\">"; 
    //previous button 
    if ($page > 1) 
     $pagination.= "<a href=\"$targetpage?page=$prev\"><<- PREVIOUS</a>"; 
    else 
     $pagination.= "<span class=\"disabled\"><<- PREVIOUS</span>"; 

    //pages 
    if ($lastpage < 7 + ($adjacents * 2)) //not enough pages to bother breaking it up 
    { 
     for ($counter = 1; $counter <= $lastpage; $counter++) 
     { 
      if ($counter == $page) 
       $pagination.= "<span class=\"current\">$counter</span>"; 
      else 
       $pagination.= "<a href=\"$targetpage?page=$counter\">$counter</a>";     
     } 
    } 
    elseif($lastpage > 5 + ($adjacents * 2)) //enough pages to hide some 
    { 
     //close to beginning; only hide later pages 
     if($page < 1 + ($adjacents * 2))   
     { 
      for ($counter = 1; $counter < 4 + ($adjacents * 2); $counter++) 
      { 
       if ($counter == $page) 
        $pagination.= "<span class=\"current\">$counter</span>"; 
       else 
        $pagination.= "<a href=\"$targetpage?page=$counter\">$counter</a>";     
      } 
      $pagination.= "..."; 
      $pagination.= "<a href=\"$targetpage?page=$lpm1\">$lpm1</a>"; 
      $pagination.= "<a href=\"$targetpage?page=$lastpage\">$lastpage</a>";  
     } 
     //in middle; hide some front and some back 
     elseif($lastpage - ($adjacents * 2) > $page && $page > ($adjacents * 2)) 
     { 
      $pagination.= "<a href=\"$targetpage?page=1\">1</a>"; 
      $pagination.= "<a href=\"$targetpage?page=2\">2</a>"; 
      $pagination.= "..."; 
      for ($counter = $page - $adjacents; $counter <= $page + $adjacents; $counter++) 
      { 
       if ($counter == $page) 
        $pagination.= "<span class=\"current\">$counter</span>"; 
       else 
        $pagination.= "<a href=\"$targetpage?page=$counter\">$counter</a>";     
      } 
      $pagination.= "..."; 
      $pagination.= "<a href=\"$targetpage?page=$lpm1\">$lpm1</a>"; 
      $pagination.= "<a href=\"$targetpage?page=$lastpage\">$lastpage</a>";  
     } 
     //close to end; only hide early pages 
     else 
     { 
      $pagination.= "<a href=\"$targetpage?page=1\">1</a>"; 
      $pagination.= "<a href=\"$targetpage?page=2\">2</a>"; 
      $pagination.= "..."; 
      for ($counter = $lastpage - (2 + ($adjacents * 2)); $counter <= $lastpage; $counter++) 
      { 
       if ($counter == $page) 
        $pagination.= "<span class=\"current\">$counter</span>"; 
       else 
        $pagination.= "<a href=\"$targetpage?page=$counter\">$counter</a>";     
      } 
     } 
    } 

    //next button 
    if ($page < $counter - 1) 
     $pagination.= "<a href=\"$targetpage?page=$next\">NEXT ->></a>"; 
    else 
     $pagination.= "<span class=\"disabled\">NEXT ->></span>"; 
    $pagination.= "</div>\n";  
} 



    while($row = mysql_fetch_array($result)) 
    { 

    // Your while loop here 

    } 
?> 
関連する問題