代码之家  ›  专栏  ›  技术社区  ›  Kieran Andrews

连接3个表-如何连接

  •  0
  • Kieran Andrews  · 技术社区  · 16 年前

    这是我当前的查询-它没有得到所需的结果。我希望它显示所有的“资源”,即使它们没有连接。

    SELECT *
    FROM (`user_permissions`)
    JOIN `user_groups` ON `user_groups`.`id` = `user_permissions`.`role`
    JOIN `user_resources` ON `user_resources`.`id` = `user_permissions`.`resource`
    WHERE `role` = '4'
    

    当我尝试左联接或右联接时,它仍然返回相同的结果。我得到的结果是:

    id   | role  | resource | name
    
    5    | 4     |        2 | Changelog 
    

    我想要

    id   | role  | resource | name
    
    5    | 4    |   2 | Changelog 
    null | null | null | Resource2 
    null | null | null | Resource3
    

    这有可能吗?

    4 回复  |  直到 14 年前
        1
  •  3
  •   lc.    16 年前

    查看您的查询, role 是其中的一部分 user_permissions 这是可能存在或可能不存在的连接之一。考虑将WHERE子句改为 WHERE `role`= '4' OR `role` IS NULL 如果您还想显示这些空记录…

    另外,尽管这可以通过正确的连接来完成,但我相信如果您从 user_resources 相反,在其他表上留下join。这源于您的问题描述语句;您希望“显示所有的‘资源’,即使它们没有连接”,这意味着您希望从资源中进行选择,然后连接任何存在的连接。

        2
  •  2
  •   oezi    16 年前

    在您的SQL中,您要求

    WHERE `role` = '4'
    

    想要一个结果 null 在里面 role ? 无效的 不是 4 所以没有这样的结果。

        3
  •  1
  •   slifty    16 年前

    第一: WHERE子句将始终限制结果集。您有一个条件要求角色为“4”--因此它不会显示任何结果,除非结果在“角色”列中有“4”。

    第二: “name”来自何处——因为这是您想要显示的名称,所以您需要让具有该列的表作为基表,并左键联接其他两个表。

    假设“name”来自资源,则查询应为:

    SELECT *
    FROM `user_resources`
    LEFT JOIN `user_permissions` ON `user_permissions`.`resource` = `user_resources`.`id`
    LEFT JOIN `user_groups` ON `user_groups`.`id` = `user_permissions`.`role`
    
        4
  •  1
  •   DEVOPS    14 年前

    选择* 从( user_permissions ) 加入 user_groups 用户群 . id = 用户权限 . role 加入 user_resources 用户资源 . 身份证件 = 用户权限 . resource 何处( 角色 =“4”或 角色 为零)

    您将从这个查询中得到结果