如何离开连接或内部连接表本身

时间:2012-03-22 15:04:08

标签: mysql sql left-join inner-join self-join

我在表中有这些数据,例如,

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 joininner 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

3 个答案:

答案 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,null3,add,10联系起来,因为您打算在查询中执行此操作

要表示分层数据,通常需要一个具有引用其自己的主键的外键的表。因此,您的专栏parent必须引用专栏id,然后您才能在manageadd之间表达亲子关系。目前,这是不可能的。