MySQL - 多级别类别结构

时间:2013-11-19 17:29:22

标签: php mysql sql database hierarchical-data

给出以下数据和表结构:

id       name          parent_id
================================
1        food          NULL
2        snacks        1
3        cakes         2
4        birthdays     3

我想将这些行与所有父类别一起输出。因此,例如,我想生成一个查询来输出数据,如下所示:

id       name          parent_id    parent_1    parent_2    parent_3
===================================================================
1        food          NULL         NULL        NULL        NULL
2        snacks        1            1           NULL        NULL
3        cakes         2            1           2           NULL
4        birthdays     3            1           2           3

有了这个,我可以很容易地获得给定类别的每个父级别的ID。

我已尝试使用子查询执行此操作但未完全设法使其正确。这就是我的尝试:

SELECT id, name, parent_id, parent_id AS _parent_1,
(SELECT parent_id FROM categories WHERE id = _parent_1) AS _parent_2,
(SELECT parent_id FROM categories WHERE id = _parent_2) AS _parent_3
FROM `categories`

编辑:根据反馈,似乎要以所需格式获取数据有点困难。

至少可以获得给定类别的所有子类别吗?因此,例如对于类别ID 1,它应该输出它下面的三个类别(如果它将包括给定类别本身,则输出四个类别)。

1 个答案:

答案 0 :(得分:2)

您可以根据需要多次自行加入表格,以满足最大嵌套深度。这看起来像这样:

SELECT
  c.id AS id,
  c.name AS name,
  parent.id AS parent,
  grandparent.id AS grandparent,
  greatgrandparent.id AS greatgrandparent
/* add other columns based on max depth of nesting */
FROM categories AS c
LEFT JOIN categories AS parent
  ON c.parent_id = parent.id
LEFT JOIN categories AS grandparent
  ON parent.parent_id = grandparent.id
LEFT JOIN categories AS greatgrandparent
  ON grandparent.parent_id = greatgrandparent.id
/* keep joining based on max depth of nesting */