2013-06-01 3 views
0

Je souhaite récupérer toutes les catégories enfants avec une catégorie parent donnée ET je souhaite associer la table de mes produits à ce résultat. Le résultat devrait être un fil d'Ariane où un utilisateur pourrait cliquer sur une catégorie parente et récupérer tous les produits de cette catégorie avec les catégories enfants. Si un utilisateur clique sur «Musique», le résultat devrait contenir tous les produits des catégories «Musique» «Lecteur MP3» et «Flash».Récupérer toutes les catégories enfants de la table des produits imbriqués et des produits jointes

J'utilise un ensemble imbriqué mais je trouve qu'il est vraiment difficile de le gérer avec des requêtes compliquées.

Ma base de données ressemble que:

category_table: ID/Nom/LFT/rgt products_table: ID/Titre/Description/pic/category_id/...

Ma requête ressemble à ceci:

$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()); 

Mais cela me donne l'erreur "# 1104 - le SELECT examinerait plus de lignes max_join_size, vérifiez votre WHERE et utilisez SET SQL_BIG_SELECTS = 1 ou SET max_join_size = # si le SELECT est correct". Je ne comprends pas.

+0

si vous pouvez faire le changement de DB, je suggère l'utilisation « Fil d'Ariane » champ dans le tableau de la catégorie, et la virgule magasin valeur seperated de tous les parents dans ce domaine, votre recherche sera relativement facile et augmenter les performances est ajouté avantage. –

Répondre

0

Essayez ce script PHP. Il peut y avoir quelques erreurs de syntaxe, je ne l'ai pas encore testé, mais il devrait faire exactement ce que vous voulez.

Il est important de noter, vous devez ajouter un champ à votre table categories, appelée category_parent_id et définir sa valeur par défaut soit 0 ou 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); 
Questions connexes