mysql8遞迴的方法

2022-06-09 12:39:08 字數 2584 閱讀 1385

cte

首先了解一下什麼是 cte,全名 common table expressions

with

cte1

as (select a, b from

table1),

cte2

as (select c, d from

table2)

select b, d from cte1 join

cte2

where cte1.a = cte2.c;

cte1, cte2 為我們定義的cte,可以在當前查詢中引用,可以看出 cte 就是乙個臨時結果集,和派生表類似

遞迴查詢

先來看下遞迴查詢的語法

with recursive cte_name as

(select ... --

return initial row set

union

all/

union

distinct

select ... --

return additional row sets

)select

*from cte;

遞迴部分不能包括:

上面的講解可能有點抽象,通過例子慢慢來理解

with recursive cte (n) as

--這裡定義的n相當於結果集的列名,也可在下面查詢中定義

(select

1union

allselect n +

1from cte where n <5)

select

*from

cte;

--result+--

----+

| n |+--

----+|1

||2|

|3||

4||5

|+------+

example

最後來看乙個樹結構的例子

create

table

`c_tree` (

`id`

int(11) not

null

auto_increment,

`cname`

varchar(255) collate utf8mb4_unicode_ci default

null

,`parent_id`

int(11) default

null

,primary

key(`id`)

) engine

=innodb auto_increment=

13default charset=utf8mb4 collate=

utf8mb4_unicode_ci;

mysql

>

select

*from

c_tree;+--

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

| id | cname | parent_id |+--

--+---------+-----------+|1

|1|0

||2|

2|0|

|3|3

|0||

4|1-

1|1|

|5|1

-2|1

||6|

2-1|

2||7

|2-2

|2||

8|3-

1|3|

|9|3

-1-1

|8||

10|3-

1-2|

8||11

|3-1

-1-1

|9||

12|3-

2|3|

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

mysql>

with recursive tree_cte as

(select

*from c_tree where parent_id =

3union

allselect t.*

from c_tree t inner

join tree_cte tcte on t.parent_id =

tcte.id

)select

*from

tree_cte;+--

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

| id | cname | parent_id |+--

--+---------+-----------+|8

|3-1

|3||

12|3-

2|3|

|9|3

-1-1

|8||

10|3-

1-2|

8||11

|3-1

-1-1

|9|+

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

mysql8問題 mysql8中的問題

only full group by 對於group by聚合操作,如果在 select 中的列,沒有在 group by 現,那麼這個sql是不合法的,因為列不在group by從句中。no auto value on zero 該值影響自增長列的插入。預設設定下,插入0或null代表生成下乙個自...

mysql8建立不了使用者 mysql8建立使用者

假如是mysql8版本的話,使用 grant all privileges to 使用者 localhost identified by 自定義密碼 會報錯,因為要先建立使用者再進行賦權,不能同時進行 建立使用者 create user 使用者名稱 localhost identified by 密...

Linux下安裝mysql8的方法

cd usr local pkg 如 wget tar xvf mysql 8.0.17 linux glibc2.12 i686.tar.xz 解壓安裝包 此處,如果出現如下錯誤 tar child xz cannot exec no such file or directory tar chil...