代码之家  ›  专栏  ›  技术社区  ›  uberweb

MYSQL内部连接2 ON子句

  •  1
  • uberweb  · 技术社区  · 16 年前

    我试图建立一个简单的数据库,在其中我有一个用户,并存储他们的住宅和邮政地址。我有两张桌子

    id (Primary Key)    
    name (Varchar 255)
    residential_id (foreign key)
    postal_id (foreign key)
    

    地址

    id (primary key)
    type (enum of R and P)
    street (varchar 255)
    suburb (varchar 255)
    

    我尝试进行一个内部联接,因此最终得到的结果集如下所示。

    id-名称-住宅区街道-住宅区郊区、邮政区街道、邮政区郊区

    我的SQL语法是

    SELECT * FROM users 
    LEFT JOIN address
    ON (users.residential_id = address.id AND users.postal_id = address.id)
    

    编辑正如已经指出的那样,我的数据库设计相当差,我希望改进它。 我试图实现的关键是,我可以存储一个人的详细信息以及他们相关的住宅和邮政地址。我将永远不会希望扩展数据库以包括一个工作地址,例如,这样希望减少表的复杂性。

    4 回复  |  直到 14 年前
        1
  •  3
  •   Jim Garrison    16 年前

    以下假设:

    1. 地址表中有一个addressType列,用于区分邮寄地址和居住地址

    你想要的是:

    select 
      u.*, 
      res.street residential_street,
      res.suburb residential_suburb,
      pos.street postal_street,
      pos.suburb postal_suburb
    from users u
        left join address res on u.id=res.id and res.addressType='R'
        left join address pos on u.id=pos.id and pos.addressType='P'
    

    如果您的模式不同,请澄清,我将修改我的答案。

        2
  •  0
  •   Ólafur Waage    16 年前

        3
  •  0
  •   cletus    16 年前

    这相对容易。您只需要加入地址表两次。

    SELECT u.id,
           u.name,
           ar.street residential_atreet,
           ar.suburb residential_suburb,
           ap.street postal_street,
           ap.suburb postal_suburb
    FROM users u
    LEFT JOIN address ar ON u.residential = ar.id
    LEFT JOIN address ap ON u.postal = ap.id
    

    我个人并不喜欢这种数据模型。相反,我建议使用地址类型字段和一对多关系(地址表中的user.id外键)。

    您将面临的一个问题是(在您的模型中)确定地址的用户所有权并不是非常简单的。寻找孤立地址也是如此。

        4
  •  0
  •   MadMurf    16 年前

    @m3mbran3我的建议是将住宅id&来自用户的邮政标识字段

    使用者

    id (Primary Key)    
    name (Varchar 255)
    

    地址

    id (if required, otherwise primary key is combo of userid,type)
    user_id
    type (enum of R and P)
    street (varchar 255)
    suburb (varchar 255)
    

    SELECT u.id,
           u.name,
           ar.street residential_street,
           ar.suburb residential_suburb,
           ap.street postal_street,
           ap.suburb postal_suburb
    FROM users u
    LEFT JOIN address ar 
               ON u.id = ar.user_id
               AND ar.type = 'R'
    LEFT JOIN address ap 
               ON u.id = ap.user_id
               AND ap.type = 'P'
    

    @Cletus建议的变体。请记住,如果用户有居住地址而没有邮政地址,或者反之亦然,则可能存在空值