sql >> Databáze >  >> RDS >> Mysql

získat všechny položky kategorie a jejího potomka

S největší pravděpodobností budete chtít vytvořit vnořené sady. Jejich nastavení je trochu složitější, ale dotazy jsou MNOHEM jednodušší. Takže místo nadřazené kategorie budete mít dva sloupce - lft a rgt . Vlevo a vpravo jsou v podstatě hranice kategorie, pokud je id kategorie položky mezi těmito hodnotami, víte, že jde o potomka dané kategorie.

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

Poté, abyste získali počet položek v kategorii auta, můžete to udělat super jednoduše takto:

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'

Samozřejmě stačí změnit hodnotu category_name a získejte položky v JAKÉKOLI kategorii.

Lituji, z nějakého důvodu se obrázek při nahrání sem otočil, ale pokud své kategorie nakreslíte jako kruhy a poté očíslujete řádky, uvidíte, jaká by měla být hodnota pro levou a pravou stranu.

Auta jsem dělal jen proto, že jsem si myslel, že můžete extrapolovat, abyste získali další kategorie.

Pokud tedy své kategorie napíšete takto:

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

Potom můžete svou závorku označit čísly:

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]

Nebo pokud to znázorníte jako strom, můžete jej označit takto, kde označíte uzel nejvíce vlevo číslem a pravý uzel označíte pouze tehdy, když označíte všechny jeho potomky:



  1. Kódujte své první API pomocí Node.js a Express:Připojte databázi

  2. odstranit duplicitní řádky z Oracle

  3. sqlite:jak přidat celkový čas hh:mm:ss, kde je datový typ sloupce DATETIME?

  4. Jak deklarovat proměnnou v dotazu PostgreSQL