基于三个表的层次结构

时间:2019-04-26 06:31:31

标签: mysql sql database

我想要像下面的单个表一样的行

id name parentId

我当前的表是(它们之间的键是外键)

category
id name

是所有父项 和

subcategory
id name catId

最后一个表是活动

activity
id name subcatId

对于category表的parentId,它将是空的,因为category是所有表的父级

到目前为止,我的尝试均未成功

样本数据

category
C-1  HR null
C-2  Development null

subcategory
SC-1 Hiring  C-1
SC-2 Admin C-1
SC-3 Developer C-2

activity
A-1 College Hiring SC-1
A-2 Job Fair SC-1
A-3 Java Development SC-3


Result Needed
1 HR null
2 Development null
3 Hiring C-1
4 Admin C-1
5 Developer C-2
6 College SC-1
7 Job Fair SC-1
8 Java Development SC-3

我希望情况更清楚。如果您需要任何更多信息,请告诉我 谢谢

我尝试2张桌子

select name 
from (
    select c.name   
    from category c 
    union all
    select b.name 
    from subcategory b
        inner join category ca
            on ca.id = b.parentId
     )

我说错了

  

每个派生表必须具有自己的别名

我是否需要在查询中添加以下行

start with parent_id is null
connect by prior id = parent_id

2 个答案:

答案 0 :(得分:2)

尝试这样的事情:

SELECT @id := @id + 1 AS id, name, parent_id
FROM ( SELECT name, NULL AS parent_id FROM category
       UNION ALL
       SELECT id, name, catId FROM subcategory
       UNION ALL
       SELECT id, name, parentId FROM activity
     ) q,
     ( SELECT @id := 0 ) w;
  • 使用UNION ALL来连接多个查询的结果。
  • UNION中,第一个查询的列名称用作结果集的列名称。
  • 使用变量@id和赋值运算符:=来生成列ID的计算值。
  • 请注意:如果您使用LIMITOFFSET,则列id的值将不一致。

答案 1 :(得分:0)

实际上,这样应该可以解决您的问题:

select name 
from (
    select c.name   
    from category c 
    union all
    select b.name 
    from subcategory b
        inner join category ca
            on ca.id = b.parentId
     ) A -- alias is required for sub-query. 

您可以将任何内容设置为别名,只要它不会与某些MySQL保留字冲突即可。您也可以) AS A这样设置。

对于您而言,我认为没有必要进行子查询或内部联接。如果您确实希望结果是这样,则可以使用union all:

SELECT name,'' as ID from category
UNION ALL
SELECT name,catId FROM subcategory
UNION ALL
SELECT name,subcatId FROM activity;