MySQL 子ID查父ID

在MySQL数据库中,有时候需要通过子ID查找对应的父ID。这种场景在关系型数据库中非常常见,比如我们要查询一个员工的上级,或者查找一个商品的分类。本文将介绍如何通过MySQL实现子ID查父ID的功能。

数据库表格结构

为了方便演示,我们假设有一个名为employees的表格,用于存储员工的信息。表格的结构如下所示:

CREATE TABLE employees (
  id INT PRIMARY KEY AUTO_INCREMENT,
  name VARCHAR(50) NOT NULL,
  parent_id INT,
  FOREIGN KEY (parent_id) REFERENCES employees(id)
);

该表格包含了三个字段:

  • id:员工ID,是一个自增的整数类型字段,作为主键。
  • name:员工姓名,是一个字符串类型字段。
  • parent_id:父级员工ID,是一个整数类型字段,用于表示员工的上级。这个字段建立了与自身的外键关系。

插入数据

为了演示子ID查父ID的功能,我们先向employees表格中插入一些测试数据:

INSERT INTO employees (name, parent_id) VALUES
('张三', NULL),
('李四', 1),
('王五', 1),
('赵六', 2),
('钱七', 2),
('孙八', 3);

通过以上SQL语句,我们向employees表格中插入了6条员工信息。其中,张三是最高级别的员工,没有上级。其他员工的上级通过parent_id字段来表示。

子ID查父ID的SQL查询

要实现子ID查父ID的功能,我们可以使用递归查询或者自连接查询。下面分别介绍这两种方法的实现。

递归查询

递归查询是一种通过递归调用查询语句的方法,可以在一次查询中获取到所有层级的父ID。在MySQL中,可以使用WITH RECURSIVE语句来实现递归查询。

WITH RECURSIVE employee_hierarchy AS (
  SELECT id, name, parent_id 
  FROM employees 
  WHERE id = 6
  UNION ALL
  SELECT e.id, e.name, e.parent_id 
  FROM employees e 
  JOIN employee_hierarchy eh ON e.id = eh.parent_id
)
SELECT * FROM employee_hierarchy;

以上SQL语句中,WITH RECURSIVE语句定义了一个名为employee_hierarchy的递归查询。首先,从employees表格中选取ID为6的员工作为起始点。然后,通过UNION ALL连接查询,将上级员工的信息与当前员工的信息进行合并。递归查询会一直进行,直到没有更多的上级员工。

执行以上SQL语句,可以得到员工孙八的所有上级信息。

自连接查询

自连接查询是一种通过将表格与自身进行连接,实现多层级查询的方法。在我们的示例中,可以通过自连接查询来实现子ID查父ID的功能。

SELECT e1.id, e1.name, e1.parent_id, e2.name AS parent_name
FROM employees e1
JOIN employees e2 ON e1.parent_id = e2.id
WHERE e1.id = 6;

以上SQL语句中,我们将employees表格与自身进行了连接,通过JOIN关键字将两次连接的结果合并。通过条件e1.parent_id = e2.id,我们将子ID与父ID进行了关联。最后,通过WHERE语句来限定只查询ID为6的员工的信息。

执行以上SQL语句,可以得到员工孙八的上级信息。

流程图

下面是通过Mermaid语法绘制的子ID查父ID的流程图:

flowchart TD
    subgraph 数据库
    A((employees表格))
    end
    subgraph 插入数据
    B((插入测试数据))
    A-->B
    end
    subgraph 递归查询
    C((WITH RECURSIVE语句))
    B-->C
    end
    subgraph 自连接查询
    D((自