【问题标题】:Select from 2 Tables, 2 Foreign Keys with 1 exception value | MySQL从 2 个表、2 个外键和 1 个异常值中选择 | MySQL
【发布时间】:2016-09-19 13:27:22
【问题描述】:

我正在尝试为以下问题创建一个 sql 语句: 我有两张桌子:

**Table user**
    user_id      |  user_name
    1            |  Carl
    2            |  Claudia
    3            |  Janet
    4            |  Ben

**Table matching**
    matching_id  |    user_id_1_FK  |    user_id_2_FK
    1            |    1             |    2
    2            |    3             |    1
    3            |    4             |    2 

现在想要列出用户 carl 参与其中的所有匹配/对

结果应该是:

user_name    | user_id
Claudia      | 2
Janet        | 3

谢谢提前帮助。

【问题讨论】:

    标签: mysql join foreign-keys


    【解决方案1】:

    这种查询的增值对我来说不是很明显,但是在玩了一会儿之后,我想出了以下解决方案:

    SELECT DISTINCT other_user_id, target.user_name
    FROM (
        select user_id_1_FK as leading_user_id, user_id_2_FK as other_user_id
        from matching
    
        union all
    
        select user_id_2_FK as leading_user_id, user_id_1_FK as other_user_id
        from matching
    ) as allmatching 
    LEFT JOIN user as target on allmatching.other_user_id = target.user_id
    RIGHT JOIN user as source on allmatching.leading_user_id = source.user_id
    WHERE source.user_name = 'Carl';
    

    诀窍在于,显然,您的匹配表指定了一个双向属性:从哪一侧读取它并不重要。为了将其纳入查询,正在使用UNION 操作。之后,只需加入 user 表两次,以允许使用“自然”术语而不是代理 ID。

    【讨论】:

    • 非常感谢,它有效。结合加入这个表来处理 UNION 操作......哇......这是一个精神上的飞跃......
    【解决方案2】:

    例如:

    DROP TABLE IF EXISTS user;
    
    CREATE TABLE user
    (user_id      INT NOT NULL PRIMARY KEY
    ,user_name VARCHAR(12) NOT NULL
    );
    
    INSERT INTO user VALUES
    (1,'Carl'),
    (2,'Claudia'),
    (3,'Janet'),
    (4,'Ben');
    
    DROP TABLE IF EXISTS matching;
    
    CREATE TABLE matching
    (user_id1 INT NOT NULL
    ,user_id2 INT NOT NULL
    ,PRIMARY KEY (user_id1,user_id2)
    );
    
    INSERT INTO matching VALUES
    (1,2),
    (3,1),
    (4,2);
    
    SELECT u.* 
      FROM user u 
      JOIN matching m  
        ON u.user_id IN(m.user_id1,m.user_id2) 
      JOIN user x 
        ON x.user_id IN(m.user_id1,m.user_id2) 
     WHERE x.user_name = 'Carl' 
       AND x.user_id <> u.user_id;
    +---------+-----------+
    | user_id | user_name |
    +---------+-----------+
    |       2 | Claudia   |
    |       3 | Janet     |
    +---------+-----------+
    

    【讨论】:

      猜你喜欢
      • 2023-03-26
      • 2014-10-17
      • 2023-03-27
      • 1970-01-01
      • 1970-01-01
      • 2017-09-12
      • 1970-01-01
      • 2014-03-12
      • 1970-01-01
      相关资源
      最近更新 更多