2014-05-04 3 views
0

Je cherche à créer une liste ul de catégories et de ses sous-catégories (avec count) liées à la recherche d'utilisateurs.Catégories et sous-catégories associées avec le nombre de produits

Exemple. si vous devais aller à ebay et recherche mac book pro, sur la gauche, il montrerait

Computers/Tablets & Networking (20 items) 
    -Laptop & Desktop Accessories (5 items) 
    -Laptops & Netbooks (15 items) 

J'ai 2 tables:

Categories Table 

id | category_name | parent_id 
-------------------------------------- 
1 | computers  |  0 
2 | apple   |  2 
3 | microsoft  |  2 
4 | accessories  |  0 
5 | mouse   |  4 
6 | keyboards  |  4 
7 | printers  |  4 

############################################################# 

And Products Table 

id | product_name | category_id 
-------------------------------------- 
1 | macbook pro  |  2 
2 | macbook air  |  2 
3 | surface pro  |  3 
4 | ipad    |  2 
5 | backlit keyboard |  6 
6 | mini keyboard |  6 
7 | 3 in 1 printer |  7 


some sql and php to disply: 

computers (4) 
    -apple (3) 
    -microsoft (1) 

accessories (3) 
    -keyboards (2) 
    -printers (1) 
    -(dont show mouse because no mouses in products table) 

J'ai passé les dernières heures de recherche, mais nai trouvé ce que je cherche.

Cordialement
Shane

+0

Quelle base de données utilisez-vous? Est-ce que votre hiérarchie de catégories s'étend sur plus d'un niveau de profondeur? –

+0

im en utilisant mysql et non seulement les catégories principales et ses sous-catégories connexes. Merci d'avance. – Shane

Répondre

1

Je pense que vous pouvez obtenir ce que vous voulez juste en utilisant with rollup. Le problème est que la somme apparaîtra après les lignes de base:

select cp.category_name as parent_name, c.category_name, count(*) as numcategories 
    from products p join 
     categories c 
     on p.categoryid = c.id join 
     categories cp 
     on c.parentid = cp.id 
    group by cp.category_name, c.category_name with rollup 

Pour l'obtenir avant, essayez ceci:

select parent_name, category_name, numcategories 
from (select cp.category_name as parent_name, c.category_name, count(*) as numcategories 
     from products p join 
      categories c 
      on p.categoryid = c.id join 
      categories cp 
      on c.parentid = cp.id 
     group by cp.category_name, c.category_name with rollup 
    ) t 
where category_name is not null 
order by category_name, 
     category_name is null desc; 
+0

Je ne peux pas sembler avoir des thèses de travail, mais je ne devrais pas avoir à boucles/sqls un pour la catégorie principale et le compteur, puis la boucle secound pour les sous-catégories et le compteur. – Shane

+0

@Shane. . . Tu ne devrais pas avoir à faire ça. Comment ça ne marche pas? Erreur de syntaxe? Mauvais résultats? –

+0

s'il vous plaît voir poste ci-dessous – Shane

0

@Gordon Linoff en utilisant la deuxième statment:

$result = mysqli_query($db,"select parent_name, category_name, counter from (select cp.category_name as parent_name, c.category_name, count(*) as counter from adverts p join categories c on p.category_id = c.id join categories cp on c.parent_id = cp.id group by cp.category_name, c.category_name with rollup) t where category_name is not null order by parent_name, counter DESC"); 
$count = mysqli_num_rows($result); 

if($count >= 1){ 
    while($row = mysqli_fetch_array($result)) { 

    if (empty($rowo['category_name'])) { 

     $category_view = ("<strong>". $rowo['parent_name']. "</strong> (". $rowo['counter']. ")"); 

    }else{ 

     $category_view = ("". $rowo['category_name']. " (". $rowo['counter']. ")"); 

    } 


    echo("<li>". $category_view ."</li>"); 


    } // while loop 

} // counter >= 1 




Antiques (3) 
    -Fabric/ Textiles (2) 
    -Ethnographic Antiques (1) 
Art (5) 
    -Photographs (4) 
    -Drawings (1) 

Merci encore Gordon.

+0

pour ne pas pousser ma chance mais peut-être l'art d'abord parce que le compteur est plus grand que les antiquités. – Shane

Questions connexes