2011-02-27 1 views
0

J'ai conçu une structure SQL pour représenter les catégories et leurs sous-catégories.Sous catégories Hiérarchie

J'ai 3 tables:

Articles Table:

id,title,content 

table Catégories:

id, title, parent_id 

articles_categories:

id,article_id,category_id 

Aucun problème avec SQL, mais maintenant, disons que je suis sur l'article ID 5 article ID 5 a - 3 catégories, que 2 d'entre eux a des parents, et le principal a '0' comme parent.

Comment les récupérer tous efficacement? (disons pour - chapelure).

merci!

+1

est 'article'-' catégorie ''plusieurs à plusieurs' à relation. Si c'est alors j'irais pour Ronnis répondre –

Répondre

2

Cela devrait faire le travail:

select * from articles_categories 
left join categories on categories.id = articles_categories.category_id 
where article_id=1; 

+------+------------+-------------+------+--------+-----------+ 
| id | article_id | category_id | id | title | parent_id | 
+------+------------+-------------+------+--------+-----------+ 
| NULL |   1 |   1 | 1 | first |   0 | 
| NULL |   1 |   2 | 2 | second |   1 | 
| NULL |   1 |   3 | 3 | third |   2 | 
+------+------------+-------------+------+--------+-----------+ 

De plus, je supprimerais la colonne "id" de la table associative articles_categories.

3

À moins que la profondeur de la hiérarchie de catégorie ne soit fixe, vous ne pouvez pas le faire en MySQL avec votre modèle actuel (liste d'adjacence). Vous devrez traverser la hiérarchie en utilisant plusieurs instructions SQL dans une boucle.

Si la hiérarchie des catégories est assez statique, vous pouvez "Précalculer" l'arbre à l'aide:

  • énumération Path
  • Nested définit
  • table de fermeture

Toutes ces , métiers écrivent des performances pour la performance de lecture. Google ou rechercher SO pour l'un de ce qui précède et vous trouverez des exemples de la façon de l'implémenter. Assez souvent, je trouve que stocker les données dans une liste d'adjacence (parce que le meilleur correspond au modèle de données) et mettre en cache une copie de l'arbre dans l'application est assez bon, mais cela dépend de vos besoins bien sûr :)

+0

* Assez bon * fera quand c'est une urgence! :) Merci, j'utilise CI qui s'occupe déjà de la mise en cache, donc je vais m'en tenir à la liste d'adjacence - j'ai lu la méthode "preorder tree traversal", mais il n'y a tout simplement pas le temps de traduire ça en code maintenant ... –

Questions connexes