2013-11-19 7 views
0

У меня есть две таблицы и интересно, можно ли объединить их в один запрос.Paginate через две разные таблицы

сценарий получает catID как GET, то необходимо перечислить все subCats (если таковые имеются), а затем список фотографий, которые находятся в mainCat cat = catID and subcat = 0

subCats стол:

id | parentCat | title | addedBy | date | active | defaultPhoto

photos стол: id | title | description | fileName | fileType | uploadedBy | time | cat | subCat

У меня есть сценарий разбивки на страницы, который принимает счет и генерирует ПРЕДЕЛ, чтобы использовать , Удивление, могу ли я объединить это в один запрос для обеих таблиц, как сделать паутингу проще с тем, что у меня уже есть. Таким образом, каждый выбирает счет для обоих с соединением, затем другой выбирает результаты.

Любые идеи? На самом деле это застряло.

Это мое грязное начало, но это похоже на плохой дизайн до сих пор:

<?php 
    if ($catInfoResult = $db->select("SELECT * FROM cats WHERE id = '%s' LIMIT 1", $catID)) 
    { 
     if ($db->numRows > 0) 
     { 
      $pageTitle = h($catInfoResult[0]['title']) . ' - Photo Gallery'; 
      ?> 
       <div class="headingTitle"><?=h($catInfoResult[0]['title'])?> Photos</div> 
      <?php 

      //get subCats 
      $subCatCountResult = $db->count('subCats', '*', array('parentCat' => $catID)); 

      if (is_numeric($subCatCountResult)) 
      { 
       $PerPage = 9; //how many locations you want to show per page 

       $subCatLastPage = ceil($subCatCountResult/$PerPage); 

       if ($subCatLastPage < 1) 
       { 
        $subCatLastPage = 1; 
       } 

       $pageNum = (isset($_GET['pg'])) ? trim($_GET['pg']) : 1;  
       $pageNum = preg_replace('#[^0-9]#', '', $pageNum); 

       ////////////////////////////////////////////////// 

       $subCatLimit = 'LIMIT ' . ($pageNum - 1) * $PerPage . ',' . $PerPage; 

       ////////////////////////////////////////////////// 

       $itemList = array(
        'subCats' => array(), 
        'photos' => array() 
       ); 

       if ($subCatListResult = $db->select("SELECT * FROM subCats WHERE parentCat = %s ORDER BY title $subCatLimit", $catID)) 
       { 

        if ($db->numRows > 0) 
        { 
         foreach ($subCatListResult as $row) 
         { 

          $photoID = 0; 

          if ($row['defaultPhoto'] == 0) //look up photo for 
          { 

           if ($firstPhotoResult = $db->select("SELECT id, time FROM photos WHERE subCat = '%s' ORDER BY time ASC LIMIT 1", $row['id'])) 
           { 
            if ($db->numRows > 0) 
            { 
             $photoID = $firstPhotoResult[0]['id']; 
            } 
            else 
            { 
             $photoID = -1; 
            } 

           } 

          } 
          else 
          { 
           $photoID = $row['defaultPhoto']; 
          } 

          //add to $itemList 
          $itemList['subCats'][$row['id']] = array(
           'title' => $row['title'] 
          ); 

          $itemList['subCats'][$row['id']]['defaultPhoto'] = $photoID; 

         } 

        } 

       } 
       else 
       { 
        throwDBError(); 
       } 

       function addPhotoToItemList($row) 
       { 
        global $itemList; 

        $itemList['photos'][$row['id']] = array(
         'title' => $row['title'], 
         'fileName' => $row['fileName'], 
         'fileType' => $row['fileType'] 
        ); 

        // 

       } 

       //get photos after subcats 
       $photosOffset = 0; 

       $grabPhotosCount = 9 - count($itemList['subCats']); 

       if ($grabPhotosCount > 0) 
       { 

        if ($result = $db->select("SELECT * FROM photos WHERE cat = %s and subCat = 0 ORDER BY title LIMIT 0, $grabPhotosCount", $catID)) 
        { 
         if ($db->numRows > 0) 
         { 
          foreach ($result as $row) 
          { 
           $photosOffset++; 
           addPhotoToItemList($row); 
          } 
         } 
        } 
        else 
        { 
         throwDBError(); 
        } 


       } 


       //get photos in maincat 

       $photosCountResult = $db->count('photos', '*', array('cat' => $catID, 'subCat' => 0)); 

       if (is_numeric($photosCountResult)) 
       { 

       } 
       else 
       { 
        throwDBError(); 
       } 

       if ($pageNum < 1) 
       { 
        $pageNum = 1; 
       } 
       else if ($pageNum > $subCatLastPage) //get photos 
       { 
        if (count($itemList) < 9) 
        { 
         //load in photos for cat 




        } 

        //redirect('/gallery/?cat=' . $catID . '&pg=' . $lastPage); 
       } 

       //pagination 
       $totalCounts = $grabPhotosCount + $subCatCountResult; 

       $lastPage = ceil($totalCounts/$PerPage); 

       if ($lastPage < 1) 
       { 
        $lastPage = 1; 
       } 

       $pageNum = (isset($_GET['pg'])) ? trim($_GET['pg']) : 1;  
       $pageNum = preg_replace('#[^0-9]#', '', $pageNum); 





      } 
      else 
      { 
       throwDBError(); 
      } 

      echo '<pre>'; 
      print_r($itemList); 
      echo '</pre>'; 

     } 
     else 
     { 
      echo '<div align="center">Category not found.</div>'; 
     } 

    } 
    else 
    { 
     throwDBError(); 
    } 
?> 
+1

да, вы можете. Для реальных ответов, показать реальный код – Sebas

+0

Ваше описание сбивает с толку и неясно. Дайте нам код, который вы используете, и мы либо очистим его, либо дадим вам большие пальцы. – Snowburnt

+0

добавил мой грязный старт. Идея заключается в том, что он будет перечислять все подкаты для кошки, а затем перечислить все фотографии в главной кошке. – Keverw

ответ

0

Вы можете создать переменный номер строки, а затем выбрать из этой производной таблицы. Принимая удар на то, что может быть ваша структура таблицы, то, как это может работать:

SELECT * 
FROM (
    SELECT p.id, 
      p.title, 
      sc.title as subcat_title, 
      @curRow := @curRow + 1 AS row_number 
    FROM photos p 
    INNER JOIN subCats sc on p.subcat = sc.id 
    INNER JOIN (SELECT @curRow := 0) r 
) AS tbl 
WHERE row_number>3 AND row_number<=6 

Установить счетчики начало и конец строки поискового вызова в пункте WHERE.

Вот скрипка выше: http://sqlfiddle.com/#!2/107f7/9/0

Смежные вопросы