当前位置:Gxlcms > 数据库问题 > 一句SQL实现MYSQL的递归查询

一句SQL实现MYSQL的递归查询

时间:2021-07-01 10:21:17 帮助过:4人阅读

TABLE `treenodes` ( `id` int , -- 节点ID `nodename` varchar (60), -- 节点名称 `pid` int -- 节点父ID );

插入测试数据

  1. <span style="color: #0000ff;">INSERT</span> <span style="color: #0000ff;">INTO</span> `treenodes` (`id`, `nodename`, `pid`) <span style="color: #0000ff;">VALUES</span><span style="color: #000000;">
  2. (</span><span style="color: #ff0000;">‘</span><span style="color: #ff0000;">1</span><span style="color: #ff0000;">‘</span>,<span style="color: #ff0000;">‘</span><span style="color: #ff0000;">A</span><span style="color: #ff0000;">‘</span>,<span style="color: #ff0000;">‘</span><span style="color: #ff0000;">0</span><span style="color: #ff0000;">‘</span>),(<span style="color: #ff0000;">‘</span><span style="color: #ff0000;">2</span><span style="color: #ff0000;">‘</span>,<span style="color: #ff0000;">‘</span><span style="color: #ff0000;">B</span><span style="color: #ff0000;">‘</span>,<span style="color: #ff0000;">‘</span><span style="color: #ff0000;">1</span><span style="color: #ff0000;">‘</span>),(<span style="color: #ff0000;">‘</span><span style="color: #ff0000;">3</span><span style="color: #ff0000;">‘</span>,<span style="color: #ff0000;">‘</span><span style="color: #ff0000;">C</span><span style="color: #ff0000;">‘</span>,<span style="color: #ff0000;">‘</span><span style="color: #ff0000;">1</span><span style="color: #ff0000;">‘</span><span style="color: #000000;">),
  3. (</span><span style="color: #ff0000;">‘</span><span style="color: #ff0000;">4</span><span style="color: #ff0000;">‘</span>,<span style="color: #ff0000;">‘</span><span style="color: #ff0000;">D</span><span style="color: #ff0000;">‘</span>,<span style="color: #ff0000;">‘</span><span style="color: #ff0000;">2</span><span style="color: #ff0000;">‘</span>),(<span style="color: #ff0000;">‘</span><span style="color: #ff0000;">5</span><span style="color: #ff0000;">‘</span>,<span style="color: #ff0000;">‘</span><span style="color: #ff0000;">E</span><span style="color: #ff0000;">‘</span>,<span style="color: #ff0000;">‘</span><span style="color: #ff0000;">2</span><span style="color: #ff0000;">‘</span>),(<span style="color: #ff0000;">‘</span><span style="color: #ff0000;">6</span><span style="color: #ff0000;">‘</span>,<span style="color: #ff0000;">‘</span><span style="color: #ff0000;">F</span><span style="color: #ff0000;">‘</span>,<span style="color: #ff0000;">‘</span><span style="color: #ff0000;">3</span><span style="color: #ff0000;">‘</span><span style="color: #000000;">),
  4. (</span><span style="color: #ff0000;">‘</span><span style="color: #ff0000;">7</span><span style="color: #ff0000;">‘</span>,<span style="color: #ff0000;">‘</span><span style="color: #ff0000;">G</span><span style="color: #ff0000;">‘</span>,<span style="color: #ff0000;">‘</span><span style="color: #ff0000;">6</span><span style="color: #ff0000;">‘</span>),(<span style="color: #ff0000;">‘</span><span style="color: #ff0000;">8</span><span style="color: #ff0000;">‘</span>,<span style="color: #ff0000;">‘</span><span style="color: #ff0000;">H</span><span style="color: #ff0000;">‘</span>,<span style="color: #ff0000;">‘</span><span style="color: #ff0000;">0</span><span style="color: #ff0000;">‘</span>),(<span style="color: #ff0000;">‘</span><span style="color: #ff0000;">9</span><span style="color: #ff0000;">‘</span>,<span style="color: #ff0000;">‘</span><span style="color: #ff0000;">I</span><span style="color: #ff0000;">‘</span>,<span style="color: #ff0000;">‘</span><span style="color: #ff0000;">8</span><span style="color: #ff0000;">‘</span><span style="color: #000000;">),
  5. (</span><span style="color: #ff0000;">‘</span><span style="color: #ff0000;">10</span><span style="color: #ff0000;">‘</span>,<span style="color: #ff0000;">‘</span><span style="color: #ff0000;">J</span><span style="color: #ff0000;">‘</span>,<span style="color: #ff0000;">‘</span><span style="color: #ff0000;">8</span><span style="color: #ff0000;">‘</span>),(<span style="color: #ff0000;">‘</span><span style="color: #ff0000;">11</span><span style="color: #ff0000;">‘</span>,<span style="color: #ff0000;">‘</span><span style="color: #ff0000;">K</span><span style="color: #ff0000;">‘</span>,<span style="color: #ff0000;">‘</span><span style="color: #ff0000;">8</span><span style="color: #ff0000;">‘</span>),(<span style="color: #ff0000;">‘</span><span style="color: #ff0000;">12</span><span style="color: #ff0000;">‘</span>,<span style="color: #ff0000;">‘</span><span style="color: #ff0000;">L</span><span style="color: #ff0000;">‘</span>,<span style="color: #ff0000;">‘</span><span style="color: #ff0000;">9</span><span style="color: #ff0000;">‘</span><span style="color: #000000;">),
  6. (</span><span style="color: #ff0000;">‘</span><span style="color: #ff0000;">13</span><span style="color: #ff0000;">‘</span>,<span style="color: #ff0000;">‘</span><span style="color: #ff0000;">M</span><span style="color: #ff0000;">‘</span>,<span style="color: #ff0000;">‘</span><span style="color: #ff0000;">9</span><span style="color: #ff0000;">‘</span>),(<span style="color: #ff0000;">‘</span><span style="color: #ff0000;">14</span><span style="color: #ff0000;">‘</span>,<span style="color: #ff0000;">‘</span><span style="color: #ff0000;">N</span><span style="color: #ff0000;">‘</span>,<span style="color: #ff0000;">‘</span><span style="color: #ff0000;">12</span><span style="color: #ff0000;">‘</span>),(<span style="color: #ff0000;">‘</span><span style="color: #ff0000;">15</span><span style="color: #ff0000;">‘</span>,<span style="color: #ff0000;">‘</span><span style="color: #ff0000;">O</span><span style="color: #ff0000;">‘</span>,<span style="color: #ff0000;">‘</span><span style="color: #ff0000;">12</span><span style="color: #ff0000;">‘</span><span style="color: #000000;">),
  7. (</span><span style="color: #ff0000;">‘</span><span style="color: #ff0000;">16</span><span style="color: #ff0000;">‘</span>,<span style="color: #ff0000;">‘</span><span style="color: #ff0000;">P</span><span style="color: #ff0000;">‘</span>,<span style="color: #ff0000;">‘</span><span style="color: #ff0000;">15</span><span style="color: #ff0000;">‘</span>),(<span style="color: #ff0000;">‘</span><span style="color: #ff0000;">17</span><span style="color: #ff0000;">‘</span>,<span style="color: #ff0000;">‘</span><span style="color: #ff0000;">Q</span><span style="color: #ff0000;">‘</span>,<span style="color: #ff0000;">‘</span><span style="color: #ff0000;">15</span><span style="color: #ff0000;">‘</span>),(<span style="color: #ff0000;">‘</span><span style="color: #ff0000;">18</span><span style="color: #ff0000;">‘</span>,<span style="color: #ff0000;">‘</span><span style="color: #ff0000;">R</span><span style="color: #ff0000;">‘</span>,<span style="color: #ff0000;">‘</span><span style="color: #ff0000;">3</span><span style="color: #ff0000;">‘</span><span style="color: #000000;">),
  8. (</span><span style="color: #ff0000;">‘</span><span style="color: #ff0000;">19</span><span style="color: #ff0000;">‘</span>,<span style="color: #ff0000;">‘</span><span style="color: #ff0000;">S</span><span style="color: #ff0000;">‘</span>,<span style="color: #ff0000;">‘</span><span style="color: #ff0000;">2</span><span style="color: #ff0000;">‘</span>),(<span style="color: #ff0000;">‘</span><span style="color: #ff0000;">20</span><span style="color: #ff0000;">‘</span>,<span style="color: #ff0000;">‘</span><span style="color: #ff0000;">T</span><span style="color: #ff0000;">‘</span>,<span style="color: #ff0000;">‘</span><span style="color: #ff0000;">6</span><span style="color: #ff0000;">‘</span>),(<span style="color: #ff0000;">‘</span><span style="color: #ff0000;">21</span><span style="color: #ff0000;">‘</span>,<span style="color: #ff0000;">‘</span><span style="color: #ff0000;">U</span><span style="color: #ff0000;">‘</span>,<span style="color: #ff0000;">‘</span><span style="color: #ff0000;">8</span><span style="color: #ff0000;">‘</span>);

查询语句

  1. <span style="color: #0000ff;">SELECT</span> id <span style="color: #0000ff;">AS</span> ID,pid <span style="color: #0000ff;">AS</span> 父ID ,levels <span style="color: #0000ff;">AS</span> 父到子之间级数, paths <span style="color: #0000ff;">AS</span> 父到子路径 <span style="color: #0000ff;">FROM</span><span style="color: #000000;"> (
  2. </span><span style="color: #0000ff;">SELECT</span><span style="color: #000000;"> id,pid,
  3. </span><span style="color: #008000;">@le</span>:<span style="color: #808080;">=</span> <span style="color: #0000ff;">IF</span> (pid <span style="color: #808080;">=</span> <span style="color: #800000; font-weight: bold;">0</span> ,<span style="color: #800000; font-weight: bold;">0</span><span style="color: #000000;">,
  4. </span><span style="color: #0000ff;">IF</span>( LOCATE( CONCAT(<span style="color: #ff0000;">‘</span><span style="color: #ff0000;">|</span><span style="color: #ff0000;">‘</span>,pid,<span style="color: #ff0000;">‘</span><span style="color: #ff0000;">:</span><span style="color: #ff0000;">‘</span>),<span style="color: #008000;">@pathlevel</span>) <span style="color: #808080;">></span> <span style="color: #800000; font-weight: bold;">0</span><span style="color: #000000;"> ,
  5. SUBSTRING_INDEX( SUBSTRING_INDEX(</span><span style="color: #008000;">@pathlevel</span>,CONCAT(<span style="color: #ff0000;">‘</span><span style="color: #ff0000;">|</span><span style="color: #ff0000;">‘</span>,pid,<span style="color: #ff0000;">‘</span><span style="color: #ff0000;">:</span><span style="color: #ff0000;">‘</span>),<span style="color: #808080;">-</span><span style="color: #800000; font-weight: bold;">1</span>),<span style="color: #ff0000;">‘</span><span style="color: #ff0000;">|</span><span style="color: #ff0000;">‘</span>,<span style="color: #800000; font-weight: bold;">1</span>) <span style="color: #808080;">+</span><span style="color: #800000; font-weight: bold;">1</span><span style="color: #000000;">
  6. ,</span><span style="color: #008000;">@le</span><span style="color: #808080;">+</span><span style="color: #800000; font-weight: bold;">1</span><span style="color: #000000;">) ) levels
  7. , </span><span style="color: #008000;">@pathlevel</span>:<span style="color: #808080;">=</span> CONCAT(<span style="color: #008000;">@pathlevel</span>,<span style="color: #ff0000;">‘</span><span style="color: #ff0000;">|</span><span style="color: #ff0000;">‘</span>,id,<span style="color: #ff0000;">‘</span><span style="color: #ff0000;">:</span><span style="color: #ff0000;">‘</span>, <span style="color: #008000;">@le</span> ,<span style="color: #ff0000;">‘</span><span style="color: #ff0000;">|</span><span style="color: #ff0000;">‘</span><span style="color: #000000;">) pathlevel
  8. , </span><span style="color: #008000;">@pathnodes</span>:<span style="color: #808080;">=</span> <span style="color: #0000ff;">IF</span>( pid <span style="color: #808080;">=</span><span style="color: #800000; font-weight: bold;">0</span>,<span style="color: #ff0000;">‘</span><span style="color: #ff0000;">,0</span><span style="color: #ff0000;">‘</span><span style="color: #000000;">,
  9. CONCAT_WS(</span><span style="color: #ff0000;">‘</span><span style="color: #ff0000;">,</span><span style="color: #ff0000;">‘</span><span style="color: #000000;">,
  10. </span><span style="color: #0000ff;">IF</span>( LOCATE( CONCAT(<span style="color: #ff0000;">‘</span><span style="color: #ff0000;">|</span><span style="color: #ff0000;">‘</span>,pid,<span style="color: #ff0000;">‘</span><span style="color: #ff0000;">:</span><span style="color: #ff0000;">‘</span>),<span style="color: #008000;">@pathall</span>) <span style="color: #808080;">></span> <span style="color: #800000; font-weight: bold;">0</span><span style="color: #000000;"> ,
  11. SUBSTRING_INDEX( SUBSTRING_INDEX(</span><span style="color: #008000;">@pathall</span>,CONCAT(<span style="color: #ff0000;">‘</span><span style="color: #ff0000;">|</span><span style="color: #ff0000;">‘</span>,pid,<span style="color: #ff0000;">‘</span><span style="color: #ff0000;">:</span><span style="color: #ff0000;">‘</span>),<span style="color: #808080;">-</span><span style="color: #800000; font-weight: bold;">1</span>),<span style="color: #ff0000;">‘</span><span style="color: #ff0000;">|</span><span style="color: #ff0000;">‘</span>,<span style="color: #800000; font-weight: bold;">1</span><span style="color: #000000;">)
  12. ,</span><span style="color: #008000;">@pathnodes</span><span style="color: #000000;"> ) ,pid ) )paths
  13. ,</span><span style="color: #008000;">@pathall</span>:<span style="color: #808080;">=</span>CONCAT(<span style="color: #008000;">@pathall</span>,<span style="color: #ff0000;">‘</span><span style="color: #ff0000;">|</span><span style="color: #ff0000;">‘</span>,id,<span style="color: #ff0000;">‘</span><span style="color: #ff0000;">:</span><span style="color: #ff0000;">‘</span>, <span style="color: #008000;">@pathnodes</span> ,<span style="color: #ff0000;">‘</span><span style="color: #ff0000;">|</span><span style="color: #ff0000;">‘</span><span style="color: #000000;">) pathall
  14. </span><span style="color: #0000ff;">FROM</span><span style="color: #000000;"> treenodes,
  15. (</span><span style="color: #0000ff;">SELECT</span> <span style="color: #008000;">@le</span>:<span style="color: #808080;">=</span><span style="color: #800000; font-weight: bold;">0</span>,<span style="color: #008000;">@pathlevel</span>:<span style="color: #808080;">=</span><span style="color: #ff0000;">‘‘</span>, <span style="color: #008000;">@pathall</span>:<span style="color: #808080;">=</span><span style="color: #ff0000;">‘‘</span>,<span style="color: #008000;">@pathnodes</span>:<span style="color: #808080;">=</span><span style="color: #ff0000;">‘‘</span><span style="color: #000000;">) vv
  16. </span><span style="color: #0000ff;">ORDER</span> <span style="color: #0000ff;">BY</span><span style="color: #000000;"> pid,id
  17. ) src
  18. </span><span style="color: #0000ff;">ORDER</span> <span style="color: #0000ff;">BY</span> id

最后的结果如下:

  1. ID 父ID 父到子之间级数 父到子路径
  2. ------ ------ ------------ ---------------
  3. 1 0 0 ,0
  4. 2 1 1 ,0,1
  5. 3 1 1 ,0,1
  6. 4 2 2 ,0,1,2
  7. 5 2 2 ,0,1,2
  8. 6 3 2 ,0,1,3
  9. 7 6 3 ,0,1,3,6
  10. 8 0 0 ,0
  11. 9 8 1 ,0,8
  12. 10 8 1 ,0,8
  13. 11 8 1 ,0,8
  14. 12 9 2 ,0,8,9
  15. 13 9 2 ,0,8,9
  16. 14 12 3 ,0,8,9,12
  17. 15 12 3 ,0,8,9,12
  18. 16 15 4 ,0,8,9,12,15
  19. 17 15 4 ,0,8,9,12,15
  20. 18 3 2 ,0,1,3
  21. 19 2 2 ,0,1,2
  22. 20 6 3 ,0,1,3,6
  23. 21 8 1 ,0,8

 

一句SQL实现MYSQL的递归查询

标签:

人气教程排行