代码之家  ›  专栏  ›  技术社区  ›  Henrik P. Hessel

MySQL查询帮助

  •  2
  • Henrik P. Hessel  · 技术社区  · 15 年前

    嘿,伙计们,
    我需要有关MySQL查询的帮助。查询的输出应该如下所示

    User1       User2
    xxx1        xxx2
    xxx3        xxx1
    

    但不是

    User1       User2
    xxx1        xxx2
    xxx2        xxx1
    

    等等。

    我需要不同用户之间的所有“友谊”。友谊存在,即当

    UserId 8 exists in Column User1_id  
    UserId 4 exists in Column User2_id  
    **AND**
    UserId 8 exists in Column User2_id  
    UserId 4 exists in Column User1_id 
    

    事先谢谢!

    友谊桌

    +----------+----------+
    | User1_id | User2_id |
    +----------+----------+
    |        8 |        4 | 
    |        4 |        8 | 
    |       29 |        4 | 
    |        4 |       10 | 
    |       10 |        4 | 
    |        8 |       37 | 
    |        4 |       29 | 
    |       37 |        8 | 
    |       37 |        4 | 
    |       29 |        8 | 
    |        4 |       37 | 
    |        8 |       10 | 
    |        8 |       29 | 
    |        4 |       40 | 
    |       40 |        4 | 
    |       40 |       29 | 
    |       29 |       40 | 
    +----------+----------+
    

    用户表

    +----+-----------------------------+
    | id | username                    |
    +----+-----------------------------+
    |  4 | hhessel                     | 
    |  8 | xxx1                        | 
    | 10 | xxx2                        |  
    | 29 | xxx3                        | 
    | 40 | xxx4                        | 
    | 37 | xxx5                        | 
    | 39 | xxx6                        | 
    +----+-----------------------------+
    
    3 回复  |  直到 15 年前
        1
  •  2
  •   OMG Ponies    15 年前

    用途:

    SELECT a.user1_id, 
           a.user2_id
      FROM FRIENDSHIP a
      JOIN FRIENDSHIP b ON b.user2_id = a.user1_id
                       AND b.user1_id = a.user2_id
                       AND b.user1_id > a.user1_id
    

    你得把 user1_id 如果要反转列值,请进行比较:

    AND b.user1_id < a.user1_id
    
        2
  •  1
  •   Pablo Santa Cruz    15 年前

    你可以试试:

    select u1.username un0, u2.username un1
      from friendship f inner join user u1 on f.user1_id = u1.id
     inner join user u2 on f.user2_id = u2.id
      left join
       (
         select u2.username un0, u1.username un1
           from friendship f inner join user u1 on f.user1_id = u1.id
          inner join user u2 on f.user2_id = u2.id
       ) b using (un0, un1)
     where un0 is null
    

    不确定它是否能工作。

        3
  •  1
  •   Shoeless    15 年前

    这应该让你去:

    SELECT    f1.user1_id, f1.user2_id
    FROM      friendship f1
    LEFT JOIN friendship f2 ON f1.user1_id = f2.user2_id AND f1.user2_id = f2.user1_id
    WHERE     f1.user1_id = f2.user2_id
    

    如果需要实际的用户名等,则可以始终联接到用户表。