我希望有像下面这样单个表的行
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
的计算值。 - 请注意:如果使用
LIMIT
或OFFSET
,则列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;