SwVitaliy

Untitled

Jul 12th, 2012
80
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. mysql> describe a;
  2. +-----------+-------------+------+-----+---------+----------------+
  3. | Field     | Type        | Null | Key | Default | Extra          |
  4. +-----------+-------------+------+-----+---------+----------------+
  5. | id        | int(11)     | NO   | PRI | NULL    | auto_increment |
  6. | parent_id | int(11)     | YES  | MUL | NULL    |                |
  7. | name      | varchar(45) | NO   |     | NULL    |                |
  8. +-----------+-------------+------+-----+---------+----------------+
  9. 3 rows in set (0.04 sec)
  10.  
  11. mysql> select * from a;
  12. +----+-----------+------+
  13. | id | parent_id | name |
  14. +----+-----------+------+
  15. |  1 |      NULL | ROOT |
  16. |  2 |         1 | L1_0 |
  17. |  3 |         1 | L1_1 |
  18. |  4 |         2 | L2_0 |
  19. |  5 |         4 | L3_0 |
  20. |  6 |         4 | L3_1 |
  21. |  7 |         3 | L2_1 |
  22. +----+-----------+------+
  23. 7 rows in set (0.00 sec)
  24.  
  25. mysql> set @t=5; select distinct b.node_id, a.* from a, (select @t:=if(a.id = @t, a.parent_id, @t) as node_id from a order by a.id DESC) as b where a.id=b.node_id; # ищем путь от ноды с индексом 5 до корня, при условии, что дочерний элемент имеет индекс выше, чем свои родитель
  26. Query OK, 0 rows affected (0.00 sec)
  27.  
  28. +---------+----+-----------+------+
  29. | node_id | id | parent_id | name |
  30. +---------+----+-----------+------+
  31. |       5 |  5 |         4 | L3_0 |
  32. |       4 |  4 |         2 | L2_0 |
  33. |       2 |  2 |         1 | L1_0 |
  34. |       1 |  1 |      NULL | ROOT |
  35. +---------+----+-----------+------+
  36. 4 rows in set (0.02 sec)
  37.  
  38. mysql> truncate a;
  39. Query OK, 0 rows affected (0.19 sec)
  40.  
  41. mysql> insert into a (id, parent_id, name) values (10, NULL, 'ROOT'), (2, 10, 'L1_0'), (7, 10, 'L1_1'), (8, 7, 'L2_0'), (9, 7, 'L2_1'), (6, 9, 'L3_0'), (4, 9, 'L3_1'), (1,6, 'L4_0'), (3,1,'L5_0');
  42. Query OK, 9 rows affected (0.13 sec)
  43. Records: 9  Duplicates: 0  Warnings: 0
  44.  
  45. mysql> select* from a;
  46. +----+-----------+------+
  47. | id | parent_id | name |
  48. +----+-----------+------+
  49. |  1 |         6 | L4_0 |
  50. |  2 |        10 | L1_0 |
  51. |  3 |         1 | L5_0 |
  52. |  4 |         9 | L3_1 |
  53. |  6 |         9 | L3_0 |
  54. |  7 |        10 | L1_1 |
  55. |  8 |         7 | L2_0 |
  56. |  9 |         7 | L2_1 |
  57. | 10 |      NULL | ROOT |
  58. +----+-----------+------+
  59. 9 rows in set (0.00 sec)
  60.  
  61. mysql> set @t=1; select distinct b.node_id, a.* from a, (select @t:=if(a.id = @t, a.parent_id, @t) as node_id from a order by a.id DESC) as b where a.id=b.node_id; # начиная со второй ноды на пути к корню, условие не соблюдено. поэтому получаем только 2 ноды - осходную и ее родителя.
  62. Query OK, 0 rows affected (0.00 sec)
  63.  
  64. +---------+----+-----------+------+
  65. | node_id | id | parent_id | name |
  66. +---------+----+-----------+------+
  67. |       1 |  1 |         6 | L4_0 |
  68. |       6 |  6 |         9 | L3_0 |
  69. +---------+----+-----------+------+
  70. 2 rows in set (0.00 sec)
Advertisement
Add Comment
Please, Sign In to add comment