【问题标题】:How to left join or inner join a table itself如何左连接或内连接表本身
【发布时间】:2012-04-07 04:07:23
【问题描述】:

例如,我将这些数据放在一个表中,

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

我只想查询关键字为“管理”的行,但我希望 add 行中的列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

【问题讨论】:

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


    【解决方案1】:

    您只需要引用该表两次:

    select t1.id, t1.name, t2.id, t2.name
    from TableA t1 
      inner join TableA t2
        on t1.parent_id = t2.Id
    

    如果您想查看列表中的根,请将内部替换为左连接。

    更新:

    我误读了你的问题。在我看来,您总是有两行,管理一并添加一。从管理进入“添加”:

    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 中的所有列。

    【讨论】:

    • 感谢您的编辑和回答。测试它并做对了。谢谢!
    【解决方案2】:

    您的数据不遵循子父级层次结构。例如,您的列parent 包含值10,它不是任何id 的值,因此不可能进行子父关联。

    换句话说,没有任何东西将记录2,manage,null 与记录1,add,self 或记录4,manage,null3,add,10 相关联,正如您打算在查询中执行的那样。

    要表示分层数据,您通常需要一个具有引用它自己的主键的外键的表。所以你的列parent必须引用列id,那么你就可以表达manageadd之间的父子关系。目前,这是不可能的。

    【讨论】:

    • 抱歉,也许我应该提供更多详细信息以及我正在处理的实际表格。请看看我上面的编辑。谢谢。
    【解决方案3】:

    更新:通过 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'
    

    如果可能没有相应的添加行,请将内连接更改为左连接。

    【讨论】:

    • 我认为您不应该依赖 ID 值总是减一。这对我来说似乎是一个非常危险的假设,但也许特定系统允许它。
    • @MJB:我已将其更新为将 add 行加入到 parent_id 上的 manage 行。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-31
    相关资源
    最近更新 更多