【问题标题】:How to JOIN two FKs from a table to another table?如何将两个 FK 从一个表连接到另一个表?
【发布时间】:2011-12-27 15:28:03
【问题描述】:

我有一个多对多关系表:

relationship:

relationship_id,
first_user REFERENCES users(user_id),
second_user REFERENCES users(user_id),

users

user_id,
other user information

要读取给定用户的朋友(可以在first_usersecond_user),我需要加入两个表(relationshipsusers),但表relationships 的两列是FK

问题 1:如何连接两个表以同时使用两个 FK?

我有一个类似于表relationships 的待处理请求表。在批准请求后,它将从requests 中删除并插入到relationships

问题 2:如何在一个查询中加入三个表以检索连接和待处理请求。

【问题讨论】:

    标签: mysql sql join normalization inner-join


    【解决方案1】:

    您必须为“用户”表的实例提供别名,以便您可以单独引用它们:

    SELECT u1.*, u2.* FROM relationship r
      JOIN users u1 ON (u1.user_id = r.first_user)
      JOIN users u2 ON (u2.user_id = r.second_user)
    

    要从请求和关系中进行选择,您可以使用UNION

    SELECT u1.*, u2.* FROM relationship r
      JOIN users u1 ON (u1.user_id = r.first_user)
      JOIN users u2 ON (u2.user_id = r.second_user)
    UNION
    SELECT u1.*, u2.* FROM requests r
      JOIN users u1 ON (u1.user_id = r.first_user)
      JOIN users u2 ON (u2.user_id = r.second_user)
    

    【讨论】:

      【解决方案2】:

      要同时使用两个外键,您需要两个连接(每个连接一个):

      select * 
        from relationship r 
       inner join users u1 on (u1.user_id = r.first_user)
       inner join users u2 on (u2.user_id = r.second_user)
      

      【讨论】:

        【解决方案3】:

        {relationship_id, first_user, second_user} 表包含一个重复组

        只需删除其中一个(使 relationship_id 不唯一)并添加代理键(或将用户 ID 添加到主键)。

        CREATE TABLE relationships
        ( id INTEGER NOT NULL PRIMARY KEY
        , relationship_id INTEGER NOT NULL
        , user_id INTEGER NOT NULL REFERENCES users(user_id)
        );
        

        尝试为此构造生成约束将是一项不错的家庭作业。

        另一种方法(对于像婚姻这样的二元关系)是将“重要的其他”链接放在用户表中:

         CREATE TABLE lusers
         ( luser_id INTEGER NOT NULL PRIMARY KEY
         , magnificent_other INTEGER REFERENCES lusers (luser_id)
         ...
         );
        

        作为副作用,这也将使重婚成为不可能。 再次:很好的家庭作业来实现约束。

        【讨论】:

          猜你喜欢
          • 2015-03-14
          • 2023-03-19
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-09-28
          • 1970-01-01
          • 2020-06-23
          • 1970-01-01
          相关资源
          最近更新 更多