Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Jak mogę znaleźć wszystkie rodzeństwo mojego węzła i jego kotwice w hierarchicznym drzewie kategorii?

Nie jestem pewien, czy śledzę to wszystko, ale wygląda na to, że chcesz mieć wszystkie najbliższe dzieci z kategorii 5.

Oto sposób, aby to zrobić:

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

edytuj: OK, teraz rozumiem, że powyższe rozwiązanie jest tylko częścią tego, czego chcesz. Chcesz:

  • Bezpośredni przodkowie odtwarzaczy CD
  • "Wujkowie" odtwarzaczy CD (rodzeństwo przodków)
  • Rodzeństwo odtwarzaczy CD
  • Dzieci odtwarzaczy CD

Pozwól, że popracuję nad tym przez kilka minut.

Oto, co wymyśliłem:

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 to odtwarzacze CD
  • selected to przodkowie odtwarzaczy CD (elektronika, przenośna elektronika, odtwarzacze CD)
  • descendant jest jakimkolwiek dzieckiem lub wnukiem itp. każdego selected przodek
  • intermediate jest potomkiem każdego selected przodek, który jest także rodzicem descendant -- nie może być żadnego z nich, stąd IS NULL ograniczenie.
  • c jest łańcuchem przodków od descendant z powrotem do góry, w celu określenia głębokości.

Właśnie zdałem sobie sprawę, że moje rozwiązanie zwróci również wszystkich potomków current węzeł. Jeśli więc przeglądasz obecnie „przenośną elektronikę”, zapytanie zwróciłoby jego elementy potomne, ale zwróciłoby również „flash” wnuka, który może nie być tym, czego chcesz.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jak dodać nową kolumnę do tabeli MYSQL?

  2. MySQL Wybierz Gdzie maksymalna data i maksymalny czas

  3. Czy dobrze jest mieć kilka DAO?

  4. Projekt bazy danych Mysql dla wielu adresów klienta i adresu domyślnego

  5. Jak ustawić SQL_BIG_SELECTS=1 w instrukcji Laravel Join?