代码之家  ›  专栏  ›  技术社区  ›  Mike Sherov

mysql join query帮助:对于最左边的表中的每一行,只返回最右边表中的一行

  •  22
  • Mike Sherov  · 技术社区  · 15 年前

    我有两张桌子。我希望以这样的方式联接它们:对于最左边的表中的每个记录,只返回右表中的一条记录。我在下面举了一个例子。我想避免子查询和临时表,因为实际数据大约是4米行。我也不在乎最右边的表中哪个记录匹配,只要有一个或没有匹配。谢谢!

    表用户:

    -------------
    | id | name |
    -------------
    | 1  | mike |
    | 2  | john |
    | 3  | bill |
    -------------
    

    表事务:

    ---------------
    | uid | spent | 
    ---------------
    | 1   | 5.00  |
    | 1   | 5.00  |
    | 2   | 5.00  |
    | 3   | 5.00  |
    | 3   | 10.00 |
    ---------------
    

    预期输出:

    ---------------------
    | id | name | spent |
    ---------------------
    | 1  | mike | 5.00  |
    | 2  | john | 5.00  |
    | 3  | bill | 5.00  |
    ---------------------
    
    4 回复  |  直到 7 年前
        1
  •  38
  •   OMG Ponies    15 年前

    用途:

      SELECT u.id,
             u.name,
             MIN(t.spent) AS spent
        FROM USERS u
        JOIN TRANSACTIONS t ON t.uid = u.id
    GROUP BY u.id, u.name
    

    请注意,这只会返回至少有一个事务记录的用户。如果您希望看到没有支持记录的用户以及那些使用支持记录的用户:

       SELECT u.id,
              u.name,
              COALESCE(MIN(t.spent), 0) AS spent
         FROM USERS u
    LEFT JOIN TRANSACTIONS t ON t.uid = u.id
     GROUP BY u.id, u.name
    
        2
  •  2
  •   halfer    7 年前

    如果你不关心你回来的那一排。

    select id, name, spent
    from users
    left join transactions on users.id = transactions.uid
    group by id
    

    这将为每个用户返回一行。这将是第一个匹配的交易。

        3
  •  1
  •   Community CDub    8 年前

    SO 3305709 对于最近的一个等价问题,有一些合理的答案。DBMS引用了postgres,但是这里的差异可以忽略不计。

        4
  •  0
  •   wshato    15 年前

    如果这不能回答你的问题,我很抱歉。看起来您正在尝试查看哪些用户至少有一个事务。您可以这样做,在这个过程中,通过这样的操作查看每个用户花费了多少:

    SELECT 
        u.id,
        u.name,
        SUM(t.spent) AS total
    FROM 
        USERS u
        INNER JOIN TRANSACTIONS t 
            ON t.uid = u.id
    GROUP BY 
        u.id
        , u.name