sql >> Databasteknik >  >> RDS >> Mysql

Hur kan jag hitta alla syskon till min nod och dess ankare i ett hierarkiskt kategoriträd?

Jag är inte säker på att jag följer allt det där, men det låter som att du vill ha alla omedelbara barn i kategori 5.

Här är ett sätt att göra det:

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 = ?;

redigera: Okej, jag förstår nu att lösningen ovan bara är en del av vad du vill ha. Du vill:

  • Direkta förfäder till CD-spelare
  • "Farbröder" till CD-spelare (syskon till förfäder)
  • Syskon till CD-spelare
  • Barn till CD-spelare

Låt mig jobba på det i några minuter.

Det här är vad jag har kommit fram till:

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;
  • aktuell är CD-spelare
  • vald är förfäder till CD-spelare (elektronik, bärbar elektronik, CD-spelare)
  • ättling är något barn eller barnbarn etc. av varje vald förfader
  • mellanliggande är en ättling till varje vald förfader som också är en förälder till ättling -- det får inte finnas några av dessa, därför ÄR NULL begränsning.
  • c är kedjan av förfäder från ättling backa upp till toppen för att bestämma djupet.

Jag insåg precis att min lösning också skulle returnera alla avkomlingar till current nod. Så om du för närvarande tittade på "bärbar elektronik" skulle frågan returnera sina barn, men den skulle också returnera barnbarnets "blixt" som kanske inte är vad du vill ha.



  1. Django:sqlite för dev, mysql för prod?

  2. Java PreparedStatement hämtar senast infogade ID

  3. Hur skickar jag ett värde till en lagrad procedurparameter i OLE DB Source-komponent?

  4. 'Kan inte ansluta till MySQL-servern på \'db\' Django-Restframework med Mysql i docker