sql >> Base de Datos >  >> RDS >> Mysql

obtener todos los elementos de la categoría y su hijo

Lo más probable es que desee hacer conjuntos anidados. Son un poco difíciles de configurar, pero hacen que las consultas sean MUCHO más simples. Entonces, en lugar de la categoría principal, tendrá dos columnas:lft y rgt . Izquierda y derecha son básicamente los límites de una categoría, si la identificación de la categoría de un elemento está entre esos valores, sabrá que es un elemento secundario de esa categoría.

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

Luego, para obtener la cantidad de artículos en la categoría de autos, puedes hacerlo súper simple así:

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'

Obviamente, solo puede cambiar el valor de category_name y obtén los artículos en CUALQUIER categoría.

Lo siento, por alguna razón, la imagen giró cuando la subí aquí, pero si dibuja sus categorías como círculos y luego numera las líneas, puede ver cuál debería ser el valor para la izquierda y la derecha.

Solo hice autos porque pensé que podrías extrapolar para obtener las otras categorías.

Entonces, si escribe sus categorías de esta manera:

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

Luego puedes etiquetar tu paréntesis con números:

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]

O si lo traza como un árbol, puede etiquetarlo así, donde etiqueta el nodo más a la izquierda con un número, y solo etiqueta el nodo derecho cuando haya etiquetado a todos sus elementos secundarios: