MySQL JOIN查询帮助:对于最左边的表中的每一行,只从最右边的表中返回一行

时间:2010-07-22 21:23:23

标签: sql mysql join

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

表用户:

-------------
| 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 个答案:

答案 0 :(得分:38)

使用:

  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

请注意,这只会返回至少有一个TRANSACTIONS记录的用户。如果您想查看没有支持记录的用户以及那些用户: - 使用:

   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

答案 1 :(得分:2)

如果你不关心你回来的特定行。

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

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

答案 2 :(得分:1)

请参阅SO 3305709了解最近的等效问题,并提供一些合理的答案。 DBMS引用了Postgres,但这里的差异可以忽略不计。

答案 3 :(得分:0)

如果这实际上没有回答你的问题我很抱歉。看起来您正在尝试查看哪些用户至少有一个交易。您可以执行此操作,并在此过程中查看每个用户通过执行以下操作所花费的金额:

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