首頁 >資料庫 >mysql教程 >如何使用單一遞歸查詢來尋找 MySQL 表中的所有父記錄?

如何使用單一遞歸查詢來尋找 MySQL 表中的所有父記錄?

Mary-Kate Olsen
Mary-Kate Olsen原創
2024-12-06 18:59:12399瀏覽

How Can I Find All Parent Records in a MySQL Table Using a Single Recursive Query?

使用遞歸在 MySQL 表中尋找父級

在資料庫模式中,建立層次關係很常見。查詢此類資料時,不僅需要檢索特定記錄,還需要檢索它們的層次結構連接。本文將解決使用單一查詢在 MySQL 表中尋找記錄的所有父級的任務。

問題陳述

給定一個包含列ID、TITLE 的表、CONTROLLER、METHOD 和PARENT_ID,使用單一SQL 查找TITLE 為「Categories」的記錄的所有父項查詢。

所需輸出

輸出應顯示下列內容欄位:

  • id
  • 標題
  • 控制器
  • 方法
  • url
  • parent_id

並且應該取得記錄:

id title controller method url parent_id
3 Modules admin modules (NULL) 0
17 User Modules modules user_module (NULL) 3
31 Categories categories category (NULL) 17

解決方案

要獲得所需的輸出,我們需要利用MySQL的遞歸查詢功能。這是我們可以使用的SQL 查詢:

SELECT T2.id, T2.title,T2.controller,T2.method,T2.url
FROM (
    SELECT
        @r AS _id,
        (SELECT @r := parent_id FROM menu WHERE id = _id) AS parent_id,
        @l := @l + 1 AS lvl
    FROM
        (SELECT @r := 31, @l := 0) vars,
        menu m
    WHERE @r <> 0) T1
JOIN menu T2
ON T1._id = T2.id
ORDER BY T1.lvl DESC;

讓我們分解這個查詢:

  • 內部查詢(SELECT @r AS _id, ...) 產生一個層次結構透過遞增選擇PARENT_ID 並遞增等級來記錄。
  • 外部查詢 (SELECT T2.id, ...)將內部查詢與原始表選單(重新命名為T2)連接起來,得到想要的資料。
  • ORDER BY 子句將結果依等級降序排序。

透過執行透過此查詢,我們可以在單一資料庫呼叫中檢索標題為「類別」的記錄的所有父項。

以上是如何使用單一遞歸查詢來尋找 MySQL 表中的所有父記錄?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn