Mysql Mariadb递归查询
Mysql Mariadb recursive query
我有以下 table :
CREATE TABLE IF NOT EXISTS `tbl` (
`id` int(12) NOT NULL,
`name` varchar(50) NOT NULL,
`parentid` int(12) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
INSERT INTO `tbl` (`id`, `name`, `parentid`) VALUES
(1, 'categ 1', 0),
(2, 'xcateg 1.1', 1),
(3, 'acateg 1.2', 1),
(4, 'categ 1.2.1', 3),
(5, 'categ 2', 0),
(6, 'categ 2.1', 5);
及其递归查询:
WITH RECURSIVE tree_search (id, name, lvl, parentid) AS (
SELECT id, name, 0, parentid
FROM tbl
WHERE parentid = 0
UNION ALL
SELECT t.id, t.name,
ts.lvl + 1, ts.id
FROM tbl AS t
JOIN tree_search AS ts ON t.parentid = ts.id
)
SELECT * FROM tree_search
ORDER BY parentid, lvl, name;
运行并打印以下结果:
id | name | lvl | parentid |
----+--------------+-------+----------+
1 | categ 1 | 0 | 0 |
5 | categ 2 | 0 | 0 |
3 | acateg 1.2 | 1 | 1 |
2 | xcateg 1.1 | 1 | 1 |
4 | categ 1.2.1 | 2 | 3 |
6 | categ 2.1 | 1 | 5 |
我想在结果中添加一个额外的列,即 "parent_name"。我该怎么做呢?
编辑添加:
那是我用来构建查询的一个较旧问题的答案
使用 tbl 的内连接
CREATE TABLE IF NOT EXISTS `tbl` (
`id` int(12) NOT NULL,
`name` varchar(50) NOT NULL,
`parentid` int(12) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
INSERT INTO `tbl` (`id`, `name`, `parentid`) VALUES
(1, 'categ 1', 0),
(2, 'xcateg 1.1', 1),
(3, 'acateg 1.2', 1),
(4, 'categ 1.2.1', 3),
(5, 'categ 2', 0),
(6, 'categ 2.1', 5);
✓
✓
WITH RECURSIVE tree_search (id, name, lvl, parentid) AS (
SELECT id, name, 0, parentid
FROM tbl
WHERE parentid = 0
UNION ALL
SELECT t.id, t.name,
ts.lvl + 1, ts.id
FROM tbl AS t
JOIN tree_search AS ts ON t.parentid = ts.id
)
SELECT t.*, tb.`name` FROM tree_search t inner Join tbl tb ON t.parentid = tb.id
ORDER BY parentid, lvl, t.name;
id | name | lvl | parentid | name
-: | :---------- | --: | -------: | :---------
3 | acateg 1.2 | 1 | 1 | categ 1
2 | xcateg 1.1 | 1 | 1 | categ 1
4 | categ 1.2.1 | 2 | 3 | acateg 1.2
6 | categ 2.1 | 1 | 5 | categ 2
db<>fiddle here
或使用 left join
获取所有 id
甚至那些没有父级的。
CREATE TABLE IF NOT EXISTS `tbl` (
`id` int(12) NOT NULL,
`name` varchar(50) NOT NULL,
`parentid` int(12) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
INSERT INTO `tbl` (`id`, `name`, `parentid`) VALUES
(1, 'categ 1', 0),
(2, 'xcateg 1.1', 1),
(3, 'acateg 1.2', 1),
(4, 'categ 1.2.1', 3),
(5, 'categ 2', 0),
(6, 'categ 2.1', 5);
✓
✓
WITH RECURSIVE tree_search (id, name, lvl, parentid) AS (
SELECT id, name, 0, parentid
FROM tbl
WHERE parentid = 0
UNION ALL
SELECT t.id, t.name,
ts.lvl + 1, ts.id
FROM tbl AS t
JOIN tree_search AS ts ON t.parentid = ts.id
)
SELECT t.*, tb.`name` FROM tree_search t LEFT Join tbl tb ON t.parentid = tb.id
ORDER BY parentid, lvl, t.name;
id | name | lvl | parentid | name
-: | :---------- | --: | -------: | :---------
1 | categ 1 | 0 | 0 | null
5 | categ 2 | 0 | 0 | null
3 | acateg 1.2 | 1 | 1 | categ 1
2 | xcateg 1.1 | 1 | 1 | categ 1
4 | categ 1.2.1 | 2 | 3 | acateg 1.2
6 | categ 2.1 | 1 | 5 | categ 2
db<>fiddle here
我有以下 table :
CREATE TABLE IF NOT EXISTS `tbl` (
`id` int(12) NOT NULL,
`name` varchar(50) NOT NULL,
`parentid` int(12) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
INSERT INTO `tbl` (`id`, `name`, `parentid`) VALUES
(1, 'categ 1', 0),
(2, 'xcateg 1.1', 1),
(3, 'acateg 1.2', 1),
(4, 'categ 1.2.1', 3),
(5, 'categ 2', 0),
(6, 'categ 2.1', 5);
及其递归查询:
WITH RECURSIVE tree_search (id, name, lvl, parentid) AS (
SELECT id, name, 0, parentid
FROM tbl
WHERE parentid = 0
UNION ALL
SELECT t.id, t.name,
ts.lvl + 1, ts.id
FROM tbl AS t
JOIN tree_search AS ts ON t.parentid = ts.id
)
SELECT * FROM tree_search
ORDER BY parentid, lvl, name;
运行并打印以下结果:
id | name | lvl | parentid |
----+--------------+-------+----------+
1 | categ 1 | 0 | 0 |
5 | categ 2 | 0 | 0 |
3 | acateg 1.2 | 1 | 1 |
2 | xcateg 1.1 | 1 | 1 |
4 | categ 1.2.1 | 2 | 3 |
6 | categ 2.1 | 1 | 5 |
我想在结果中添加一个额外的列,即 "parent_name"。我该怎么做呢?
编辑添加: 那是我用来构建查询的一个较旧问题的答案
使用 tbl 的内连接
CREATE TABLE IF NOT EXISTS `tbl` ( `id` int(12) NOT NULL, `name` varchar(50) NOT NULL, `parentid` int(12) NOT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; INSERT INTO `tbl` (`id`, `name`, `parentid`) VALUES (1, 'categ 1', 0), (2, 'xcateg 1.1', 1), (3, 'acateg 1.2', 1), (4, 'categ 1.2.1', 3), (5, 'categ 2', 0), (6, 'categ 2.1', 5);
✓ ✓
WITH RECURSIVE tree_search (id, name, lvl, parentid) AS ( SELECT id, name, 0, parentid FROM tbl WHERE parentid = 0 UNION ALL SELECT t.id, t.name, ts.lvl + 1, ts.id FROM tbl AS t JOIN tree_search AS ts ON t.parentid = ts.id ) SELECT t.*, tb.`name` FROM tree_search t inner Join tbl tb ON t.parentid = tb.id ORDER BY parentid, lvl, t.name;
id | name | lvl | parentid | name -: | :---------- | --: | -------: | :--------- 3 | acateg 1.2 | 1 | 1 | categ 1 2 | xcateg 1.1 | 1 | 1 | categ 1 4 | categ 1.2.1 | 2 | 3 | acateg 1.2 6 | categ 2.1 | 1 | 5 | categ 2
db<>fiddle here
或使用 left join
获取所有 id
甚至那些没有父级的。
CREATE TABLE IF NOT EXISTS `tbl` ( `id` int(12) NOT NULL, `name` varchar(50) NOT NULL, `parentid` int(12) NOT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; INSERT INTO `tbl` (`id`, `name`, `parentid`) VALUES (1, 'categ 1', 0), (2, 'xcateg 1.1', 1), (3, 'acateg 1.2', 1), (4, 'categ 1.2.1', 3), (5, 'categ 2', 0), (6, 'categ 2.1', 5);
✓ ✓
WITH RECURSIVE tree_search (id, name, lvl, parentid) AS ( SELECT id, name, 0, parentid FROM tbl WHERE parentid = 0 UNION ALL SELECT t.id, t.name, ts.lvl + 1, ts.id FROM tbl AS t JOIN tree_search AS ts ON t.parentid = ts.id ) SELECT t.*, tb.`name` FROM tree_search t LEFT Join tbl tb ON t.parentid = tb.id ORDER BY parentid, lvl, t.name;
id | name | lvl | parentid | name -: | :---------- | --: | -------: | :--------- 1 | categ 1 | 0 | 0 | null 5 | categ 2 | 0 | 0 | null 3 | acateg 1.2 | 1 | 1 | categ 1 2 | xcateg 1.1 | 1 | 1 | categ 1 4 | categ 1.2.1 | 2 | 3 | acateg 1.2 6 | categ 2.1 | 1 | 5 | categ 2
db<>fiddle here