如何将这两个表连接在一起(MySQL、分层查询)?

如何将这两个表连接在一起(MySQL、分层查询)?,sql,mysql,hierarchical-data,Sql,Mysql,Hierarchical Data,我有一个如下所示的类别表: id | name | parent ----------------------- 1 | Toys | 1 2 | Clothing | 1 3 | Kid's Toys | 0 id | category_id | parent_id ---------------------------- 1 | 3 | 1 我有另一个名为category_relationships

我有一个如下所示的类别表:

id | name       | parent    
-----------------------    
1  | Toys       | 1
2  | Clothing   | 1
3  | Kid's Toys | 0 
id | category_id | parent_id    
----------------------------    
1  | 3           | 1
我有另一个名为category_relationships的表,它如下所示:

id | name       | parent    
-----------------------    
1  | Toys       | 1
2  | Clothing   | 1
3  | Kid's Toys | 0 
id | category_id | parent_id    
----------------------------    
1  | 3           | 1
我希望有以下输出:

类别:

Toys
  - Kid's Toys
Clothing

如何通过一个查询实现这一点?

更好/正确/可靠的答案可能是为此创建一个MySQL过程,但如果您的数据能够满足这些限制,您可以使用以下方法:

不超过5级或根据需要扩展模式 ID不超过6位或更改concat表达式 此查询使用Concat构建可排序引用,以便a的子项位于a etc之后。使用Concat和前导空格手动缩进名称

    select concat(1000000 + a.id, '|') SORT
          ,a.name
    from categories a
    where a.parent = 1 # top level parents only
union all
    select concat(1000000 + a.id, '|', 
             1000000 + IFNULL(b.id,0), '|')
          ,concat('  - ', b.name)
    from categories a
    inner join category_relationships a1 on a1.parent_id = a.id
    inner join categories b on b.id = a1.category_id
    where a.parent = 1
union all
    select concat(1000000 + a.id, '|', 
             1000000 + IFNULL(b.id,0), '|',
             1000000 + IFNULL(c.id,0), '|')
          ,concat('    - ', c.name)
    from categories a
    inner join category_relationships a1 on a1.parent_id = a.id
    inner join categories b on b.id = a1.category_id
    inner join category_relationships b1 on b1.parent_id = b.id
    inner join categories c on c.id = b1.category_id
    where a.parent = 1
union all
    select concat(1000000 + a.id, '|', 
             1000000 + IFNULL(b.id,0), '|',
             1000000 + IFNULL(c.id,0), '|',
             1000000 + IFNULL(d.id,0), '|')
          ,concat('      - ', d.name)
    from categories a
    inner join category_relationships a1 on a1.parent_id = a.id
    inner join categories b on b.id = a1.category_id
    inner join category_relationships b1 on b1.parent_id = b.id
    inner join categories c on c.id = b1.category_id
    inner join category_relationships c1 on c1.parent_id = c.id
    inner join categories d on d.id = c1.category_id
    where a.parent = 1
union all
    select concat(1000000 + a.id, '|', 
             1000000 + IFNULL(b.id,0), '|',
             1000000 + IFNULL(c.id,0), '|',
             1000000 + IFNULL(d.id,0), '|',
             1000000 + IFNULL(e.id,0))
          ,concat('        - ', e.name)
    from categories a
    inner join category_relationships a1 on a1.parent_id = a.id
    inner join categories b on b.id = a1.category_id
    inner join category_relationships b1 on b1.parent_id = b.id
    inner join categories c on c.id = b1.category_id
    inner join category_relationships c1 on c1.parent_id = c.id
    inner join categories d on d.id = c1.category_id
    inner join category_relationships d1 on d1.parent_id = d.id
    inner join categories e on e.id = d1.category_id
    order by SORT

一个更好/正确/可靠的答案可能是为此创建一个MySQL过程,但如果您的数据能够满足这些限制,您可以使用以下方法:

不超过5级或根据需要扩展模式 ID不超过6位或更改concat表达式 此查询使用Concat构建可排序引用,以便a的子项位于a etc之后。使用Concat和前导空格手动缩进名称

    select concat(1000000 + a.id, '|') SORT
          ,a.name
    from categories a
    where a.parent = 1 # top level parents only
union all
    select concat(1000000 + a.id, '|', 
             1000000 + IFNULL(b.id,0), '|')
          ,concat('  - ', b.name)
    from categories a
    inner join category_relationships a1 on a1.parent_id = a.id
    inner join categories b on b.id = a1.category_id
    where a.parent = 1
union all
    select concat(1000000 + a.id, '|', 
             1000000 + IFNULL(b.id,0), '|',
             1000000 + IFNULL(c.id,0), '|')
          ,concat('    - ', c.name)
    from categories a
    inner join category_relationships a1 on a1.parent_id = a.id
    inner join categories b on b.id = a1.category_id
    inner join category_relationships b1 on b1.parent_id = b.id
    inner join categories c on c.id = b1.category_id
    where a.parent = 1
union all
    select concat(1000000 + a.id, '|', 
             1000000 + IFNULL(b.id,0), '|',
             1000000 + IFNULL(c.id,0), '|',
             1000000 + IFNULL(d.id,0), '|')
          ,concat('      - ', d.name)
    from categories a
    inner join category_relationships a1 on a1.parent_id = a.id
    inner join categories b on b.id = a1.category_id
    inner join category_relationships b1 on b1.parent_id = b.id
    inner join categories c on c.id = b1.category_id
    inner join category_relationships c1 on c1.parent_id = c.id
    inner join categories d on d.id = c1.category_id
    where a.parent = 1
union all
    select concat(1000000 + a.id, '|', 
             1000000 + IFNULL(b.id,0), '|',
             1000000 + IFNULL(c.id,0), '|',
             1000000 + IFNULL(d.id,0), '|',
             1000000 + IFNULL(e.id,0))
          ,concat('        - ', e.name)
    from categories a
    inner join category_relationships a1 on a1.parent_id = a.id
    inner join categories b on b.id = a1.category_id
    inner join category_relationships b1 on b1.parent_id = b.id
    inner join categories c on c.id = b1.category_id
    inner join category_relationships c1 on c1.parent_id = c.id
    inner join categories d on d.id = c1.category_id
    inner join category_relationships d1 on d1.parent_id = d.id
    inner join categories e on e.id = d1.category_id
    order by SORT

分层查询-哎哟…会很难的。除非您预先知道层次结构的最大深度,否则无法编写通用解决方案,除非DBMS支持“WITH RECURSIVE”子句或非标准扩展,如“CONNECT BY”。是的,您知道树的最大深度吗?层次结构查询-哎哟…会很难。除非您预先知道层次结构的最大深度,否则无法编写通用解决方案,除非DBMS支持“WITH RECURSIVE”子句或非标准扩展,如“CONNECT BY”。是的,您知道树的最大深度吗?