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

Mik*_*rov 24 mysql sql join

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

表用户:

-------------
| id | name |
-------------
| 1  | mike |
| 2  | john |
| 3  | bill |
-------------
Run Code Online (Sandbox Code Playgroud)

表交易:

---------------
| uid | spent | 
---------------
| 1   | 5.00  |
| 1   | 5.00  |
| 2   | 5.00  |
| 3   | 5.00  |
| 3   | 10.00 |
---------------
Run Code Online (Sandbox Code Playgroud)

预期产量:

---------------------
| id | name | spent |
---------------------
| 1  | mike | 5.00  |
| 2  | john | 5.00  |
| 3  | bill | 5.00  |
---------------------
Run Code Online (Sandbox Code Playgroud)

OMG*_*ies 39

使用:

  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
Run Code Online (Sandbox Code Playgroud)

请注意,这只会返回至少有一个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
Run Code Online (Sandbox Code Playgroud)


The*_*lor 5

如果您不关心返回的特定行。

select id, name, spent
from users
left join transactions on users.id = transactions.uid
group by id
Run Code Online (Sandbox Code Playgroud)

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