sql >> Database >  >> RDS >> Mysql

krijg alle items van de categorie en zijn kind

Je zou waarschijnlijk geneste sets willen doen. Ze zijn een beetje lastig in te stellen, maar maken de vragen VEEL eenvoudiger. Dus, in plaats van categorie-ouder, krijg je twee kolommen - lft en rgt . Links en rechts zijn in feite de grenzen van een categorie, als de categorie-ID van een item tussen die waarden ligt, weet je dat het een onderliggend item van die categorie is.

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

Om vervolgens het aantal items in de categorie auto's te krijgen, kunt u het heel eenvoudig als volgt doen:

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'

Uiteraard kun je gewoon de waarde van category_name veranderen en ontvang de items in ELKE categorie.

Sorry, om de een of andere reden draaide de afbeelding toen ik hem hier uploadde, maar als je je categorieën als cirkels tekent en vervolgens de lijnen nummert, kun je zien wat de waarde moet zijn voor links en rechts.

Ik deed alleen auto's omdat ik dacht dat je kon extrapoleren om de andere categorieën te krijgen.

Dus als je je categorieën als volgt opschrijft:

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

Vervolgens kunt u uw haakjes labelen met cijfers:

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]

Of als je het als een boom in kaart brengt, kun je het als volgt labelen, waarbij je het meest linkse knooppunt labelt met een nummer, en alleen het rechterknooppunt labelt als je alle onderliggende knooppunten hebt gelabeld:



  1. Een float selecteren in MySQL

  2. SQLite-update

  3. Afbeeldingen uploaden naar de MySQL-database met behulp van PHP-code

  4. Welk VERZAMELEN moet ik instellen om alle mogelijke talen te gebruiken?