Mysql
 sql >> Base de données >  >> RDS >> Mysql

obtenir tous les éléments de la catégorie et son enfant

Vous voudriez probablement faire des ensembles imbriqués. Ils sont un peu difficiles à configurer, mais rendent les requêtes BEAUCOUP plus simples. Ainsi, au lieu de la catégorie parent, vous allez avoir deux colonnes - lft et rgt . Gauche et droite sont essentiellement les limites d'une catégorie, si l'identifiant de catégorie d'un élément se situe entre ces valeurs, vous savez qu'il s'agit d'un enfant de cette catégorie.

+----+---------------+-----+------+
| id | category name | lft | rgt  |
+----+---------------+-----+------+
| 1  | cars          |  1  |  24  |
+----+---------------+-----+------+
| 2  | bmw           |  2  |  3   |
+----+---------------+-----+------+
| 5  | audi          |  4  | 23   |
+----+---------------+-----+------+
| 6  | 100           |  5  |  6   |
+----+---------------+-----+------+
| 7  | 80            |  7  |  8   |
+----+---------------+-----+------+
| 8  | A4            |  9  | 22   |
+----+---------------+-----+------+
| 9  | TDI           |  10 | 11   |
+----+---------------+-----+------+
| 10 | Quatro        |  12 | 21   |
+----+---------------+-----+------+
| 11 | Black         |  13 | 18   |
+----+---------------+-----+------+
| 12 | White         |  19 |  20  |
+----+---------------+-----+------+
| 13 | 2 doors       |  14 |  15  |
+----+---------------+-----+------+
| 14 | 5 doors       |  16 | 17   |
+----+---------------+-----+------+

Ensuite, pour obtenir le nombre d'items dans la catégorie voitures, vous pouvez le faire super simplement comme ceci :

SELECT categories.name, items.id, items.category_id, items.name 
FROM categories 
LEFT JOIN items 
    ON (items.category_id BETWEEN categories.lft AND categories.rgt)
WHERE categories.category_name = 'cars'

Évidemment, vous pouvez simplement modifier la valeur de category_name et obtenez les articles dans N'IMPORTE QUELLE catégorie.

Désolé, pour une raison quelconque, l'image a tourné lorsque je l'ai téléchargée ici, mais si vous dessinez vos catégories sous forme de cercles, puis numérotez les lignes, vous pouvez voir quelle devrait être la valeur pour la gauche et la droite.

Je n'ai fait que des voitures car j'ai pensé que vous pouviez extrapoler pour obtenir les autres catégories.

Donc, si vous écrivez vos catégories comme ceci :

Cars(BMW(), Audi(100(),80(),A4(TDI(),Quatro(Black(2dr(),5dr()), White())))

Ensuite, vous pouvez étiqueter votre parenthèse avec des chiffres :

Cars[1]->(BMW[2]->()<-[3], Audi[4]->(100[5]->()<-[6],80[7]->()<-[8],A4[9]->(TDI[10]->()<-[11],Quatro[12]->(Black[13]->(2dr[14]->()<-[15], 5dr[16]->()<-[17])<-[18], White[19]->()<-[20])<-[21])<-[22])<-[23])<-[24]

Ou si vous le tracez comme un arbre, vous pouvez l'étiqueter comme ceci, où vous étiquetez le nœud le plus à gauche avec un nombre, et n'étiquetez le nœud de droite que lorsque vous avez étiqueté tous ses enfants :