sql >> Database >  >> RDS >> Mysql

Hoe kan ik alle broers en zussen van mijn node en zijn anchestors vinden in een hiërarchische categorieboom?

Ik weet niet zeker of ik dat allemaal volg, maar het klinkt alsof je alle directe kinderen van categorie 5 wilt.

Hier is een manier om dat te doen:

SELECT child.*
FROM Category parent
  JOIN Category child 
    ON (child.lft BETWEEN parent.lft AND parent.rgt)
  LEFT JOIN Category intermediate 
    ON (intermediate.lft > parent.lft AND intermediate.rgt < parent.rgt
      AND child.lft > intermediate.lft AND child.rgt < intermediate.rgt)
WHERE intermediate.CategoryId IS NULL
  AND parent.CategoryId = ?;

bewerken: Oké, ik begrijp nu dat de bovenstaande oplossing slechts een deel is van wat je wilt. Je wilt:

  • Directe voorouders van cd-spelers
  • "Ooms" van cd-spelers (broers en zussen van voorouders)
  • Bussen van cd-spelers
  • Kinderen van cd-spelers

Laat me daar een paar minuten aan werken.

Dit is wat ik heb bedacht:

SELECT descendant.*,
  (current.lft BETWEEN descendant.lft AND descendant.rgt) AS is_selected,
  COUNT(DISTINCT c.CategoryId) AS depth
FROM Category current
JOIN Category selected 
  ON (current.lft BETWEEN selected.lft AND selected.rgt)
JOIN Category descendant 
  ON (descendant.lft BETWEEN selected.lft AND selected.rgt)
LEFT JOIN Category intermediate 
  ON (intermediate.lft > selected.lft AND intermediate.rgt < selected.rgt
    AND descendant.lft > intermediate.lft AND descendant.lft < intermediate.rgt)
JOIN Category c
  ON (descendant.lft BETWEEN c.lft AND c.rgt)
WHERE intermediate.CategoryId IS NULL
  AND current.CategoryId = ?
GROUP BY descendant.CategoryId
ORDER BY depth, descendant.name;
  • current is cd-spelers
  • selected is voorouders van cd-spelers (elektronica, draagbare elektronica, cd-spelers)
  • descendant is een kind of kleinkind enz. van elke selected voorouder
  • intermediate is een afstammeling van elke selected voorouder die ook een ouder is van descendant -- deze mogen er niet zijn, vandaar de IS NULL beperking.
  • c is de keten van voorouders van descendant terug naar boven, om de diepte te bepalen.

Ik realiseerde me net dat mijn oplossing ook alle nakomelingen van de current . zou opleveren knooppunt. Dus als je momenteel naar 'draagbare elektronica' kijkt, zou de zoekopdracht de kinderen retourneren, maar ook de 'flits' van het kleinkind, wat misschien niet is wat je wilt.



  1. Hoe u optimaal gebruik kunt maken van de commentaarfunctie in MySQL

  2. Fout bij het verzenden van uitvoer van een mysql-query naar een csv-bestand

  3. MySQL verander tabel wijzigen kolom mislukt bij rijen met null-waarden

  4. SQL Server ALL-operator uitgelegd