我在表中有这些数据,例如,
id name parent parent_id
1 add self 100
2 manage null 100
3 add 10 200
4 manage null 200
5 add 20 300
6 manage null 300
我如何left join
或inner join
此表本身,以便我在下面得到此结果?
id name parent
2 manage self
4 manage 10
6 manage 20
我可以,我只想查询关键字“manage”的行,但我希望添加的行中的parent
列数据为在管理的结果行中。
有可能吗?
修改
我的实际表格的简化版本 - system
,
system_id parent_id type function_name name main_parent make_accessible sort
31 30 left main Main NULL 0 1
32 31 left page_main_add Add self 0 1
33 31 left page_main_manage Manage NULL 0 2
我的实际查询已经非常混乱......
SELECT
a.system_id,
a.main_parent,
b.name,
b.make_accessible,
b.sort
FROM system AS a
INNER JOIN -- self --
(
SELECT system_id, name, make_accessible, sort
FROM system AS s2
LEFT JOIN -- search --
(
SELECT system_id AS parent_id
FROM system AS s1
WHERE s1.function_name = 'page'
) AS s1
ON s1.parent_id = s2.parent_id
WHERE s2.parent_id = s1.parent_id
AND s2.system_id != s1.parent_id
ORDER BY s2.sort ASC
) b
ON b.system_id = a.parent_id
WHERE a.function_name LIKE '%manage%'
ORDER BY b.sort ASC
我目前得到的结果,
system_id main_parent name make_accessible sort
33 NULL Main 0 1
但我在此之后,
system_id main_parent name make_accessible sort
33 self Main 0 1
答案 0 :(得分:9)
您只需要引用该表两次:
select t1.id, t1.name, t2.id, t2.name
from TableA t1
inner join TableA t2
on t1.parent_id = t2.Id
如果要查看列表中的根,请将内部替换为左连接。
<强>更新强>
我误解了你的问题。在我看来,你总是有两行,管理一行并添加一行。要从manage获得“添加”:
select system.*, (select parent
from system s2
where s2.parent_id = system.parent_id
and s2.name = 'add')
AS parent
from system
where name = 'manage'
或者,您可以将表拆分为两个派生表,并通过parent_id连接它们:
select *
from system
inner join
(
select * from system where name = 'add'
) s2
on system.parent_id = s2.parent_id
where system.name = 'manage'
这将允许您使用s2中的所有列。
答案 1 :(得分:2)
更新:通过parent_id加入,尝试:
select m.id, m.name, a.parent
from myTable m
join myTable a on m.parent_id = a.parent_id and a.name = 'add'
where m.name = 'manage'
如果可能没有相应的添加行,请将内部联接更改为左联接。
答案 2 :(得分:2)
您的数据不遵守子级 - 父级层次结构。例如,您的列parent
包含值10
,这不是任何id
的值,因此无法进行子父关联。
换句话说,没有任何内容可以将记录2,manage,null
与记录1,add,self
或记录4,manage,null
与3,add,10
联系起来,因为您打算在查询中执行此操作
要表示分层数据,通常需要一个具有引用其自己的主键的外键的表。因此,您的专栏parent
必须引用专栏id
,然后您才能在manage
和add
之间表达亲子关系。目前,这是不可能的。