Mysql
 sql >> база данни >  >> RDS >> Mysql

Как мога да намеря всички братя и сестри на моя възел и неговите предшественици в йерархично дърво на категории?

Не съм сигурен, че спазвам всичко това, но звучи така, сякаш искате всички непосредствени деца от категория 5.

Ето начин да направите това:

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

редактиране: Добре, сега разбирам, че решението по-горе е само част от това, което искате. Искате:

  • Преки предшественици на CD плейърите
  • „Чичовци“ на CD плейъри (братя и сестри на предците)
  • Братя и сестри на CD плейъри
  • Деца на CD плейъри

Нека поработя върху това за няколко минути.

Ето какво измислих:

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 е CD плейъри
  • selected е предшественик на CD плейърите (електроника, преносима електроника, CD плейъри)
  • descendant е всяко дете или внуче и т.н. от всеки selected прародител
  • intermediate е потомък на всеки selected предшественик, който също е родител на descendant -- не трябва да има нито едно от тях, следователно IS NULL ограничение.
  • c е веригата от предци от descendant обратно към върха, за целите на определяне на дълбочината.

Току-що разбрах, че моето решение също ще върне всички потомци на current възел. Така че, ако в момента преглеждате „преносима електроника“, заявката ще върне нейните деца, но също така ще върне „flash“ на внука, което може да не е това, което искате.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Групирайте записи по месец и година в Rails

  2. Как да определим кое е по-ефективно:РАЗЛИЧНО или КЪДЕ СЪЩЕСТВУВА?

  3. INSERT..RETURNING не работи в JOOQ

  4. MySQL:изберете последния пълен интервал от 5 минути

  5. Импортиране на голяма таблица в MySQL