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

MySQL视图:子联接

  •  1
  • Ixmatus  · 技术社区  · 17 年前

    我希望有一个视图表,它聚合四个表中的行。

    第一个主表是 客户机 它只是一个主键唯一ID和一个配置文件ID。第二个表, 轮廓 ,包含所有名字、地址、邮政编码类型的信息。第三张桌子是 电子邮件 ;一个客户端对象可以有多个电子邮件对象,但只有一个电子邮件对象具有 初级的 列标记为真;第四个表是 电话 -这也是一种多对一关系(可以有手机、家庭电话、传真号码等),只有一个对象可以拥有 初级的 列标记。

    加入 客户机 表与 轮廓 表很简单,因为它是一对一的;我想要的建议是如何根据 初级的 列(而不是第一个联接的结果)。

    我能找到的任何资源都会非常感谢,因为我已经找了几天的材料。

    提前谢谢!

    2 回复  |  直到 17 年前
        1
  •  0
  •   Alex Martelli    17 年前
    select whatevercolumnsyouwant
      from client
      join profile using (profile_id)
      join email on client.profile_id = email.profile_id
                and email.primary = 1
      join phone on client.profile_id = phone.profile_id
                and phone.primary = 1
    where client.id = :whateverclientid
    

    关键是,在join子句的子类上,可以指定几个条件(in和,or,whatever),就像子句可以在其中指定条件一样,但具有更“特定”的目的!

        2
  •  1
  •   Mikael Auno    17 年前

    加入时不应该有什么问题 email phone 也是。只需将它们加入另一个直接的连接并添加 WHERE phone.primary = TRUE 作为一个普通人 WHERE -克劳斯。

    我认为,应该这样做:

    SELECT * 
      FROM client
      JOIN profile
      ON profile.client_id = client.id
      JOIN email
      ON email.client_id = client.id
      JOIN phone
      ON phone.client_id = client.id
    WHERE phone.primary = TRUE AND
          email.primary = TRUE