遞歸查詢mysql數據庫設計,mysql向上遞歸查詢語句

本文目錄一覽:

mysql遞歸查詢語句

mysql遞歸查詢,mysql中從子類ID查詢所有父類(做無限分類經常用到)

由於mysql 不支持類似 oracle with …connect的 遞歸查詢語法

之前一直以為類似的查詢要麼用存儲過程要麼只能用程序寫遞歸查詢.

現在發現原來一條sql語句也是可以搞定的

先來看數據表的結構如下:

id name parent_id

—————————

1 Home 0

2 About 1

3 Contact 1

4 Legal 2

5 Privacy 4

6 Products 1

7 Support 1

我要的要求是根據一個分類ID(這個分類ID可能是一個子分類),得到所有的父分類,下面是相應的SQL:

SELECT T2.id, T2.name

FROM (

SELECT

@r AS _id,

(SELECT @r := parent_id FROM table1 WHERE id = _id) AS parent_id,

@l := @l + 1 AS lvl

FROM

(SELECT @r := 5, @l := 0) vars,

table1 h

WHERE @r 0) T1

JOIN table1 T2

ON T1._id = T2.id

ORDER BY T1.lvl DESC

代碼@r := 5標示查詢id為5的所有父類。結果如下

1, ‘Home’

2, ‘About’

4, ‘Legal’

5, ‘Privacy’

自己仿照這看一下!

mysql查詢一個表,實現遞歸查詢

給你個網上寫的比較好的例子:

方法一:利用函數來得到所有子節點號。

創建一個function

getChildLst,

得到一個由所有子節點號組成的字符串.

mysql

delimiter

//

mysql

mysql

CREATE

FUNCTION

`getChildLst`(rootId

INT)

RETURNS

varchar(1000)

BEGIN

DECLARE

sTemp

VARCHAR(1000);

DECLARE

sTempChd

VARCHAR(1000);

SET

sTemp

=

‘$’;

SET

sTempChd

=cast(rootId

as

CHAR);

WHILE

sTempChd

is

not

null

DO

SET

sTemp

=

concat(sTemp,’,’,sTempChd);

SELECT

group_concat(id)

INTO

sTempChd

FROM

treeNodes

where

FIND_IN_SET(pid,sTempChd)0;

END

WHILE;

RETURN

sTemp;

END

//

Query

OK,

rows

affected

(0.00

sec)

mysql

mysql

delimiter

;

使用我們直接利用find_in_set函數配合這個getChildlst來查找

mysql

select

getChildLst(1);

+—————–+

|

getChildLst(1)

|

+—————–+

|

$,1,2,3,4,5,6,7

|

+—————–+

1

row

in

set

(0.00

sec)

mysql

select

*

from

treeNodes

where

FIND_IN_SET(id,

getChildLst(1));

+—-+———-+——+

|

id

|

nodename

|

pid

|

+—-+———-+——+

|

1

|

A

|

|

|

2

|

B

|

1

|

|

3

|

C

|

1

|

|

4

|

D

|

2

|

|

5

|

E

|

2

|

|

6

|

F

|

3

|

|

7

|

G

|

6

|

+—-+———-+——+

7

rows

in

set

(0.01

sec)

mysql

select

*

from

treeNodes

where

FIND_IN_SET(id,

getChildLst(3));

+—-+———-+——+

|

id

|

nodename

|

pid

|

+—-+———-+——+

|

3

|

C

|

1

|

|

6

|

F

|

3

|

|

7

|

G

|

6

|

+—-+———-+——+

3

rows

in

set

(0.01

sec)

MySQL怎樣做遞歸查詢

mysql的逆襲:如何做遞歸層次查詢

最近在做一個從oracle數據庫到mysql數據庫的移植,遇到一個這樣的問題

在Oracle 中我們知道有一個 Hierarchical Queries 通過CONNECT BY 我們可以方便的查了所有當前節點下的所有子節點。但shi,在MySQL的目前版本中還沒有對應的函數!!!

換句話來說,想要用mysql實現遞歸查詢,根本做不到!!!

可是經過我數天茶不思飯不想的刻苦琢磨,終於想到了一個合理的,適用於mysql和其他sql的解決方案。

方案一出,就秋風掃落葉之勢,席捲整個dao層~~~所到之處,所有問題迎刃而解,讓所有問題都不再為問題 都成為了我這個函數的炮灰而已。。。

原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/303433.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2024-12-31 11:49
下一篇 2024-12-31 11:49

相關推薦

  • 如何修改mysql的端口號

    本文將介紹如何修改mysql的端口號,方便開發者根據實際需求配置對應端口號。 一、為什麼需要修改mysql端口號 默認情況下,mysql使用的端口號是3306。在某些情況下,我們需…

    編程 2025-04-29
  • Python 常用數據庫有哪些?

    在Python編程中,數據庫是不可或缺的一部分。隨着互聯網應用的不斷擴大,處理海量數據已成為一種趨勢。Python有許多成熟的數據庫管理系統,接下來我們將從多個方面介紹Python…

    編程 2025-04-29
  • Python3支持多行語句

    Python3是一種高級編程語言,開發人員可以輕鬆地使用該語言編寫簡單到複雜的代碼。其中Python3支持多行語句,方便開發人員編寫複雜的代碼,提高代碼的可讀性和可維護性。 一、使…

    編程 2025-04-29
  • openeuler安裝數據庫方案

    本文將介紹在openeuler操作系統中安裝數據庫的方案,並提供代碼示例。 一、安裝MariaDB 下面介紹如何在openeuler中安裝MariaDB。 1、更新軟件源 sudo…

    編程 2025-04-29
  • Python for循環語句打印九九乘法表

    本篇文章將詳細介紹如何使用Python的for循環語句打印九九乘法表。打印九九乘法表是我們初學Python時經常練習的一項基礎操作,也是編寫Python程序的基本能力之一。 1、基…

    編程 2025-04-29
  • Python操作MySQL

    本文將從以下幾個方面對Python操作MySQL進行詳細闡述: 一、連接MySQL數據庫 在使用Python操作MySQL之前,我們需要先連接MySQL數據庫。在Python中,我…

    編程 2025-04-29
  • Python中while語句和for語句的區別

    while語句和for語句是Python中兩種常見的循環語句,它們都可以用於重複執行一段代碼。然而,它們的語法和適用場景有所不同。本文將從多個方面詳細闡述Python中while語…

    編程 2025-04-29
  • Python中自定義函數必須有return語句

    自定義函數是Python中最常見、最基本也是最重要的語句之一。在Python中,自定義函數必須有明確的返回值,即必須要有return語句。本篇文章將從以下幾個方面對此進行詳細闡述。…

    編程 2025-04-29
  • 台階走法遞歸

    台階走法遞歸是一個經典的遞歸問題,在計算機算法中有着廣泛的應用。本篇文章將從遞歸的思想出發,詳細分析如何解決這個問題。 一、遞歸基礎知識 遞歸是指一個函數直接或間接地調用自身。遞歸…

    編程 2025-04-29
  • 數據庫第三範式會有刪除插入異常

    如果沒有正確設計數據庫,第三範式可能導致刪除和插入異常。以下是詳細解釋: 一、什麼是第三範式和範式理論? 範式理論是關係數據庫中的一個規範化過程。第三範式是範式理論中的一種常見形式…

    編程 2025-04-29

發表回復

登錄後才能評論