mysql5.7实现 1) 根据指定记录的id,查询该记录关联的所有祖先记录,并按层级返回祖先记录name 2) 根据指定parent_id,查询其关联的的所有后辈记录id
时间: 2024-02-24 08:54:33 浏览: 81
好的,针对你的问题,我来回答一下。
1. 根据指定记录的id,查询该记录关联的所有祖先记录,并按层级返回祖先记录name:
这个问题可以通过 MySQL 的递归查询来实现。假设我们有一个表`my_table`,它的结构如下:
```
id | parent_id | name
--------------------------
1 | null | A
2 | 1 | B
3 | 2 | C
4 | 3 | D
```
我们现在要查询 id 为 4 的记录的所有祖先记录的 name,并按层级返回。可以使用以下 SQL 语句:
```
WITH RECURSIVE cte AS (
SELECT id, parent_id, name, 1 AS level
FROM my_table
WHERE id = 4
UNION ALL
SELECT t.id, t.parent_id, t.name, cte.level + 1
FROM my_table t
JOIN cte ON t.id = cte.parent_id
)
SELECT name
FROM cte
ORDER BY level DESC;
```
这个 SQL 语句使用了 MySQL 的递归查询(也称为递归公共表表达式)。首先,我们在 CTE(WITH 子句)中查询出 id 为 4 的记录,并将它的 level 设为 1。然后,我们将这个记录与它的 parent 记录进行连接,使用 UNION ALL 将结果合并。这里使用了 cte 表达式来表示递归查询的结果。最后,我们从 cte 中选取祖先记录的 name,并按照 level 降序排序,即从祖先到自己的顺序返回祖先记录的 name。
2. 根据指定 parent_id,查询其关联的的所有后辈记录id:
这个问题可以使用简单的递归查询来实现。假设我们有一个表`my_table`,它的结构如下:
```
id | parent_id | name
--------------------------
1 | null | A
2 | 1 | B
3 | 2 | C
4 | 3 | D
```
我们现在要查询 parent_id 为 2 的记录的所有后辈记录的 id。可以使用以下 SQL 语句:
```
WITH RECURSIVE cte AS (
SELECT id
FROM my_table
WHERE parent_id = 2
UNION ALL
SELECT t.id
FROM my_table t
JOIN cte ON t.parent_id = cte.id
)
SELECT id
FROM cte;
```
这个 SQL 语句也使用了 MySQL 的递归查询。首先,我们在 CTE(WITH 子句)中查询出 parent_id 为 2 的记录的 id。然后,我们将这些记录与它们的子记录进行连接,使用 UNION ALL 将结果合并。这里也使用了 cte 表达式来表示递归查询的结果。最后,我们从 cte 中选取所有记录的 id,即为后辈记录的 id。
阅读全文