[英]MySQL Select All Rows Linked By ID In Same Table
我有一個包含字段的表:
父級引用同一個表中的主鍵 ID(不是外鍵)。
+----+--------+------------+
| ID | Parent | Title |
+----+--------+------------+
| 1 | 0 | Wallpapers |
| 2 | 1 | Nature |
| 3 | 2 | Trees |
| 4 | 3 | Leaves |
+----+--------+------------+
我正在嘗試選擇一行及其所有父項。 例如,如果我選擇“Leaves”,我還想獲得“Trees”、“Nature”和“Wallpaper”,因為這是層次結構的父路徑。 這在一個查詢中是可能的嗎? 目前,我在 ColdFusion 中使用循環來獲取每次迭代的下一個父級,但效率不夠高。
您必須使用自連接來實現此目的:-
SELECT T1.Title AS CHILD, T2.Title AS PARENT
FROM YOUR_TABLE T1, YOUR_TABLE T2
WHERE T1.PARENT = T2.ID
AND T1.Title = 'Leaves'
在 PHP 中,我編寫了一個函數來檢索路由表的所有層次結構(無限深度)。
我認為,在這個例子中,你可以看到你正在尋找的查詢的 SQL 語法。 除了小寫外,我使用相同的列名。
function get_breadcrumb($route_id) {
//access PDO mysql object instance
global $db;
// sanitize route ID
$route_id = intval($route_id);
// query construction
$q = "SELECT T2.*
FROM (
SELECT
@r AS parent_id,
(SELECT @r := `parent` FROM `route` WHERE id = parent_id) AS `parent`,
@l := @l + 1 AS `depth`
FROM
(SELECT @r := $route_id, @l := 0) vars,
`route` T3
WHERE @r <> 0) T1
JOIN `route` T2
ON T1.parent_id = T2.id
ORDER BY T1.`depth` DESC";
// call query in database
if($res = $db->query($q)) {
if($res = $res->fetchAll(PDO::FETCH_ASSOC)) {
if($size = sizeof($res) > 0) {
// push results in breadcrumb items array
$breadcrumb['items'] = $res;
$breadcrumb['levels'] = $size;
// retrieve only titles
$titles = array_column($res, 'title');
// construct html result seperated by '>' or '/'
$breadcrumb['html']['gt'] = implode(' > ', $titles);
$breadcrumb['html']['sl'] = implode(' / ', $titles);
// returns all result (added in SESSION too)
return $_SESSION['app']['breadcrumb'] = $breadcrumb;
}
}
}
// no result for that route ID
return false;
}
嘗試這個
SELECT
DISTINCT c.id AS 'ID', c.title AS 'Name'
FROM YourTable c, YourTable p
WHERE c.id = p.parent AND c.title = 'Leaves'
使用 UNION 將返回主行的查詢與另一個返回父行的查詢組合在一起。
SELECT *
FROM YourTable
WHERE Title = "Leaves"
UNION
SELECT t1.*
FROM YourTable AS t1
JOIN YourTable AS t2 ON t1.id = t2.parent
WHERE t2.Title = "Leaves")
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.