基于三个表的层次结构



我希望有像下面这样单个表的行

id name parentId

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

category
id name

哪个是所有人的父母和

subcategory
id name catId

最后一个表是活动

activity
id name subcatId

对于类别表的父 ID,它什么都不是,因为类别是所有父级

到目前为止,我的尝试没有成功

示例数据

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

尝试这样的事情:

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的值将不连贯。

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

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.

对于您的情况,我认为没有必要进行子查询或内部连接。如果你真的希望结果是这样的,你可以使用联合所有:

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

最新更新