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

Mysql заявка, която връща дърво на категории

Няма единична SQL заявка които могат да ви донесат резултати, подредени по начина, който очаквате въз основа на тази структура на таблицата.

Има два начина за решаване на проблема:

  1. Използвайте външна логика на приложението (извън DB), за да извършвате рекурсивни извиквания, които ще открият дъщерни елементи от всяка категория и ще изградят дървото в приложението.

  2. Използвайте един от алгоритмите за съхраняване на дървовидни данни в релационна база данни. Един от тези алгоритми се нарича Modified Preorder Tree Traversal или просто MPTT.

Ако приемем, че използваме колони lft и rgt за да поддържате леви/десни индекси при преминаване, когато вмъкнете нова категория, ще трябва да:

  1. Получете информация за родителската категория по идентификатор:SELECT lft,rgt FROM tbl_categories WHERE categoryId=5 Да предположим за пример, че родителската категория е имала lft=7 и rgt=10 (в този случай вече има едно дете)

  2. Направете място за нов запис - преместете всички записи с 2 (1 за lft и 1 за rgt):

    UPDATE tbl_categories SET rgt=rgt+2 WHERE rgt>=10 ORDER BY rgt DESC

    UPDATE tbl_categories SET lft=lft+2 WHERE lft>=10 ORDER BY lft DESC

Забележете тук ORDER низходящо. Като lft и rgt се предполага, че са уникални, препоръчително е да направите UNIQUE ограничение върху тях, а след това е необходим низходящ ред в актуализацията, за да се предотвратят дублиращи се ключови грешки.

  1. Задайте lft=<former parent rgt> и rgt=<former parent rgt +1> и поставете нов запис...

    INSERT INTO tbl_categories SET categoryName="New Child",parentCategoryId=5,lft=11,rgt=12,...

Можете да намерите по-подробни примери с код, ако потърсите MPTT PHP MySQL . Има доста уроци по тази тема.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Използване на ограничение за ляво присъединяване в mysql

  2. Как да създадете съхранена процедура в MySQL с Knex raw

  3. MySQL получава датата преди n дни като времева марка

  4. SQL стандартно извикване UPSERT

  5. Данните са съкратени за колона „xxxx“ на ред 1