通过父类别ID获取父类别

时间:2020-08-17 08:06:01

标签: mysql sql

我具有以下类别的数据库结构

+----+---------------+-----------+
| id | category_name | parent_id |
+----+---------------+-----------+
| 1  | Category One  | 0         |
| 2  | Category Two  | 1         |
| 3  | Category Three| 1         |
| 4  | Category Four | 1         |
| 5  | Category Five | 1         |
| 6  | Category Six  | 1         |
+----+---------------+-----------+

我有一个变量,其中包含一个子ID,例如category_id = 4,其parent_id = 1

我想获得所有父子类别,包括它自己4

我没有父母ID,我只有具有我需要的parent_category的category_id

我到目前为止所做的

SELECT child.*
FROM `ec_categories` AS `child`
LEFT JOIN `ec_categories` AS `parent` ON `child`.`parent_id`=`parent`.`id`
WHERE `child`.`id` = '4'

有没有一种方法可以使用1个查询来获取它们?

2 个答案:

答案 0 :(得分:0)

如果内部查询没有问题,则可以使用

SELECT * FROM categories where parent_id=(SELECT parent_id FROM categories where id=4);

答案 1 :(得分:0)

假设您具有以下架构:

CREATE TABLE categories (
    id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY, 
    name varchar(25) NOT NULL, 
    parent_id INT
);
    
INSERT INTO categories (name, parent_id)
VALUES
    ('Cat 1', 0),
    ('Cat 2', 1),
    ('Cat 3', 1),
    ('Cat 4', 2),
    ('Cat 5', 3);

然后您可以使用recursive common table expression

WITH RECURSIVE parents AS
  ( SELECT id, name, parent_id
    FROM categories
    WHERE id = 4 -- 4 as an example here
    UNION ALL
    SELECT c.id, c.name, c.parent_id
    FROM categories c
    JOIN parents p
    ON p.parent_id = c.id
  ) 
  
SELECT * FROM parents;

结果:

+----+-------+-----------+
| id | name  | parent_id |
+----+-------+-----------+
|  4 | Cat 4 |         2 |
|  2 | Cat 2 |         1 |
|  1 | Cat 1 |         0 |
+----+-------+-----------+

您将需要最新版本的MariaDB / MySql