Maison > base de données > tutoriel mysql > Une question sur la récursivité dans MySQL

Une question sur la récursivité dans MySQL

黄舟
Libérer: 2017-05-21 09:32:40
original
963 Les gens l'ont consulté

Cet article présente principalement les problèmes mineurs récursifs de MySQLLes amis qui en ont besoin peuvent se référer à

mysql lui-même ne prend pas en charge la syntaxe récursive, mais il peut le faire. être utilisé automatiquement La connexion implémente une simple récursivité déguisée

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

--递归小方法:临时表和普通表的不同方法

--这题使用的是2次临时表查询父节点的递归

 

drop table if exists test;

create table test(

id varchar(100),

name varchar(20),

parentid varchar(100)

);

insert test select

'13ed38f1-3c24-dd81-492f-673686dff0f3', '大学教师', '37e2ea0a-1c31-3412-455a-5e60b8395f7d' union all select

'1ce203ac-ee34-b902-6c10-c806f0f52876','小学教师', '37e2ea0a-1c31-3412-455a-5e60b8395f7d' union all select

'37e2ea0a-1c31-3412-455a-5e60b8395f7d', '教师' ,      null                union all select

'c877b7ea-4ed3-f472-9527-53e1618cb1dc', '高数老师', '13ed38f1-3c24-dd81-492f-673686dff0f3' union all select

'ce50a471-2955-00fa-2fb7-198f6b45b1bd', '中学教师', '37e2ea0a-1c31-3412-455a-5e60b8395f7d';

  

delimiter $$

  

create procedure usp_ser(in idd varchar(100))

begin

declare lev int;

set lev=1;

drop table if exists tmp1;

drop table if exists tmp2;

CREATE TEMPORARY TABLE tmp1(id varchar(100),name varchar(20),parentid varchar(100),levv int);

CREATE TEMPORARY TABLE tmp2(pid varchar(100));

insert tmp2 select parentid from test where id=idd;

insert tmp1 select t.* , lev from test t join tmp2 a on t.id=a.pid;

    while exists(select 1 from tmp2 )

do

truncate tmp2;

set lev=lev+1;

insert tmp2 select t.id from test t join tmp1 a on t.id=a.parentid and a.levv=lev-1;

insert tmp1 select t.*,lev from test t join tmp2 a on t.id=a.pid;

end while ;

select id,name,parentid from tmp1;

end;

$$

  

delimiter ;

  

 call usp_ser('c877b7ea-4ed3-f472-9527-53e1618cb1dc');

+--------------------------------------+----------+--------------------------------------+

| id                  | name   | parentid               |

+--------------------------------------+----------+--------------------------------------+

| 13ed38f1-3c24-dd81-492f-673686dff0f3 | 大学教师 | 37e2ea0a-1c31-3412-455a-5e60b8395f7d |

| 37e2ea0a-1c31-3412-455a-5e60b8395f7d | 教师   | NULL                 |

+--------------------------------------+----------+--------------------------------------+

  

 call usp_ser('13ed38f1-3c24-dd81-492f-673686dff0f3');

+--------------------------------------+------+----------+

| id                  | name | parentid |

+--------------------------------------+------+----------+

| 37e2ea0a-1c31-3412-455a-5e60b8395f7d | 教师 | NULL   |

+--------------------------------------+------+----------+

  

 call usp_ser('37e2ea0a-1c31-3412-455a-5e60b8395f7d');

  

Empty set (0.02 sec)

Copier après la connexion

La méthode ci-dessus est due au fait que MySQL n'autorise pas plusieurs références à la table temporaire dans la même instruction, donc la table temporaire est utilisé deux fois
Ce qui suit est une requête récursive pour interroger des sous-nœuds en utilisant une table normale à la fois

Code principal

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

drop table if exists test;

create table test(

id INT,

parentid INT

);

insert test select

1, 0 UNION ALL SELECT

2, 1 UNION ALL SELECT

3, 1 UNION ALL SELECT

4, 0 UNION ALL SELECT

5, 2 UNION ALL SELECT

6, 5 UNION ALL SELECT

7, 3 ;

Go

  

delimiter $$

  

create procedure usp_ser(in idd varchar(100))

begin

declare lev int;

set lev=1;

drop table if exists tmp1;

CREATE TABLE tmp1(id INT,parentid INT ,levv INT,ppath VARCHAR(1000));

 

INSERT tmp1 SELECT *,lev,id FROM test WHERE parentid=idd;

 

 while row_count()>0

do

 

set lev=lev+1;

insert tmp1 select t.*,lev,concat(a.ppath,t.id) from test t join tmp1 a on t.parentid=a.id AND levv=LEV-1;

  

end while ;

SELECT * FROM tmp1;

  

end;

$$

  

delimiter ;

  

 call usp_ser(0);

  

/*

+------+----------+------+-------+

| id  | parentid | levv | ppath |

+------+----------+------+-------+

|  1 |    0 |  1 | 1   |

|  4 |    0 |  1 | 4   |

|  2 |    1 |  2 | 12  |

|  3 |    1 |  2 | 13  |

|  5 |    2 |  3 | 125  |

|  7 |    3 |  3 | 137  |

|  6 |    5 |  4 | 1256 |

+------+----------+------+-------+*/

Copier après la connexion

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Étiquettes associées:
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers numéros
MySQL arrête le processus
Depuis 1970-01-01 08:00:00
0
0
0
Env中mysql
Depuis 1970-01-01 08:00:00
0
0
0
Erreur lors de l'installation de MySQL sous Linux
Depuis 1970-01-01 08:00:00
0
0
0
php - problème de surveillance MySQL
Depuis 1970-01-01 08:00:00
0
0
0
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal