Mysql
 sql >> Database >  >> RDS >> Mysql

ottenere tutti gli elementi della categoria e il relativo figlio

Molto probabilmente vorresti fare set nidificati. Sono un po' difficili da configurare, ma rendono le query MOLTO più semplici. Quindi, invece della categoria padre, avrai due colonne:lft e rgt . Sinistra e destra sono fondamentalmente i confini di una categoria, se l'ID categoria di un elemento è compreso tra quei valori, sai che è un figlio di quella categoria.

+----+---------------+-----+------+
| 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   |
+----+---------------+-----+------+

Quindi, per ottenere il numero di articoli nella categoria auto, puoi farlo semplicemente in questo modo:

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'

Ovviamente puoi semplicemente cambiare il valore di category_name e ottieni gli articoli in QUALSIASI categoria.

Siamo spiacenti, per qualche motivo l'immagine è ruotata quando l'ho caricata qui, ma se disegna le tue categorie come cerchi e poi numeri le linee, puoi vedere quale dovrebbe essere il valore per sinistra e destra.

Ho fatto solo automobili poiché ho pensato che potevi estrapolare per ottenere le altre categorie.

Quindi, se scrivi le tue categorie in questo modo:

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

Quindi puoi etichettare la parentesi con i numeri:

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]

Oppure, se lo disegni come un albero, puoi etichettarlo in questo modo, in cui etichetti il ​​nodo più a sinistra con un numero e etichetta il nodo destro solo dopo aver etichettato tutti i suoi figli: