2013-06-01 1 views
0

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

Breadcrumb выглядит так: Electronic >> Music >> MP3-Player >> Flash Если пользователь нажимает «Музыка», результат должен содержать все продукты в категориях «Музыка», «MP3-плеер» и «Вспышка».

Я использую вложенный набор, но мне очень сложно справиться со сложными запросами.

Моя база данных выглядит следующим образом:

category_table: ID/Имя/LFT/RGT products_table: ID/Название/Описание/PIC/category_id/...

Мой запрос теперь выглядит следующим образом:

$result=mysql_query('SELECT *, node.id, node.name 
FROM category AS node, 
     category AS parent, 
     category AS sub_parent, 
     (
       SELECT node.name 
       FROM category AS node, 
       category AS parent 
       WHERE node.lft BETWEEN parent.lft AND parent.rgt 
       AND node.id = 23 
       GROUP BY node.name 
       ORDER BY node.lft 
     )AS sub_tree JOIN products ON products.id = id 
WHERE node.lft BETWEEN parent.lft AND parent.rgt 
     AND node.lft BETWEEN sub_parent.lft AND sub_parent.rgt 
     AND sub_parent.name = sub_tree.name 
GROUP BY node.name 
ORDER BY node.lft;') or die(mysql_error()); 

Но это дает мне ошибку "# 1104 - SELECT, изучит более строк max_join_size, проверьте ваше WHERE и использование SET SQL_BIG_SELECTS = 1 или SET max_join_size = # если SELECT, все в порядке". Я не понимаю.

+0

, если вы можете сделать изменения в БД, я предлагаю использовать поле «Breadcrumb» в таблице категорий, и магазин через запятую значение всех родителей в этой области, то поиск будет относительно легко и увеличить добавляет производительность преимущество. –

ответ

0

Попробуйте этот PHP-скрипт. В нем может быть пара синтаксических ошибок, я еще не тестировал его, но он должен делать именно то, что вы хотите.

важно отметить, что вам нужно добавить поле к вашей categories таблице, называется category_parent_id и установите его значение по умолчанию, либо 0 или null.

class breadcrumbNav 
{ 
    private $dataArray = array(); 
    private $breadcrumb = array(); 

    public function __construct() 
    { 
     $this->getAllRecords(); 
     return; 
    } 


    private function getAllRecords() 
    { 
     $result = $db->prepare(" 
      SELECT p.ID as product_id, p.title AS product_title, p.description AS product_description, p.pic AS product_picture, 
        c.ID as category_id, c.Name as category_name, c.lft AS category_lft, c.rgt AS category_rgt, c.parent_id AS category_parent_id 
      FROM products p 
      LEFT JOIN categories c 
       ON p.category_id = c.ID 
     "); 

     $result->execute(); 

     $this->dataArray = $result->fetchAll(PDO::FETCH_ASSOC); 
     return; 
    } 

    function buildBreadcrumb($recordId, $firstRun = true) 
    { 
     foreach($this->dataArray as $row) 
     { 
      if(($row['product_id']==$recordId && $firstRun) || ($row['category_id']==$recordId && $firstRun===false)) 
      { 
        $this->breadcrumb[] = '<a href="?categoryId=' . $row['category_id'] . '">' . $row['category_name'] . '</a>'; 

        if($row['category_parent_id']!==0 && !is_null($row['category_parent_id'])) 
        { 
         $this->buildBreadcrumb($this->buildBreadcrumb($row['category_parent_id'], false)); 
        } 
      } 
     } 

     return implode(' &gt;&gt; ', $this->breadcrumb; 
    } 
} 



$currentProductId = 'ENTER THE PRODUCT ID HERE'; 
$breadcrumbObject = new breadcrumbNav(); 
$breadcrumb = $breadcrumbObject->buildBreadcrumb($currentProductId);