MySQL 中根据 ID 返回父 ID 的实现

在数据库设计中,尤其是在处理树形结构或层级关系时,常常需要通过某一条记录的 ID 获取其父记录的 ID。本文将讲解如何在 MySQL 中实现这一功能,并提供代码示例供大家参考。

数据库设计

首先,我们假设有一个名为 categories 的表格,结构如下:

CREATE TABLE categories (
    id INT PRIMARY KEY,
    name VARCHAR(100),
    parent_id INT,
    FOREIGN KEY (parent_id) REFERENCES categories(id)
);

在这个表中,id 是类别的唯一标识,name 是类别的名称,而 parent_id 则指向该类别的父类别。一个没有父类别的根节点的 parent_id 会被设置为 NULL

插入示例数据

接下来,我们向表中插入一些示例数据,以便于后续的查询操作:

INSERT INTO categories (id, name, parent_id) VALUES
(1, 'Electronics', NULL),
(2, 'Laptops', 1),
(3, 'Desktops', 1),
(4, 'Smartphones', 1),
(5, 'Gaming Laptops', 2);

在这个例子中,Electronics 是根类别,其 ID 为 1。LaptopsDesktopsSmartphones 作为其子类别,分别具有 ID 2、3 和 4。而 Gaming Laptops 又是 Laptops 的子类别,ID 为 5。

根据 ID 查询父 ID

接下来,我们将实现查询某一类别的父类别 ID 的 SQL 语句。例如,我们想查询 Gaming Laptops(ID 为 5)的父类别 ID,可以使用以下 SQL 语句:

SELECT parent_id 
FROM categories 
WHERE id = 5;

执行上述语句后,将获得 parent_id 为 2,这意味着 Gaming Laptops 的父类别是 Laptops

多层查询

如果我们想要获取某个类别的所有祖先类别 ID(即多层查询),可以使用递归查询(需要启用 MySQL 8.0 的公共表表达式功能):

WITH RECURSIVE parent_categories AS (
    SELECT id, parent_id 
    FROM categories 
    WHERE id = 5  -- 从 Gaming Laptops 开始

    UNION ALL

    SELECT c.id, c.parent_id 
    FROM categories c 
    INNER JOIN parent_categories pc ON c.id = pc.parent_id
)
SELECT * FROM parent_categories;

以上语句将从 ID 为 5 的记录开始,逐一查找到所有的父类别,直到没有父类别为止。

总结

通过上述示例,我们展示了如何在 MySQL 中设计表结构并根据 ID 查询父 ID 的方法。通过适当的 SQL 语句,我们可以轻松地获取层级结构中的父类别,帮助我们更好地组织和管理数据。

旅行图

在此,我们用一个旅行图来比喻这一过程:

journey
    title 查询父类过程
    section 检索类别
      用户发起请求: 5: 用户
      系统查询父类: 2: 数据库
      用户查看结果: 2: 用户

通过这个简单的图表,我们可以看出用户如何发起请求,数据库如何处理并返回结果。以上就是在 MySQL 中根据 ID 返回父 ID 的全面介绍,希望能对你有所帮助!