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

подредете йерархията на sql дърво

Чрез добавяне на колона за път и тригер това може да се направи сравнително лесно.

Първо добавете колона varchar, която ще съдържа пътя от корена до възела:

ALTER TABLE category ADD path VARCHAR(50) NULL;

След това добавете тригер, който изчислява пътя при вмъкване:

(просто свързва новия идентификатор с пътя на родителя)

CREATE TRIGGER set_path BEFORE INSERT ON category
  FOR EACH ROW SET NEW.path = 
  CONCAT(IFNULL((select path from category where id = NEW.parent_id), '0'), '.', New.id);

След това просто изберете поръчка по път:

SELECT name, path FROM category ORDER BY path;

Резултат:

pizza         0.1
piperoni      0.1.4
cheese        0.1.5
extra cheese  0.1.5.7
vegetariana   0.1.6
burger        0.2
coffee        0.3

Вижте цигулка .

По този начин разходите за поддръжка също са минимални. Полето за път е скрито при вмъкване и се изчислява чрез тригер. Премахването на възел няма допълнителни разходи, тъй като всички деца на възела също се премахват. Единственият проблем е при актуализиране на parent_id на възел; Е, не правете това! :)



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Как да изберете максимум 3 елемента на потребител в MySQL?

  2. Какъв е максималният размер на заявката за mysql?

  3. Как да проверя дали MySQL таблицата е UTF-8 и има storageEngine InnoDB?

  4. Промените в my.cnf не влизат в сила (Ubuntu 16.04, mysql 5.6)

  5. Изберете от множество таблици с laravel fluent builder на заявки