我有两张桌子.我希望以这样的方式加入它们:对于最左边的表中的每个记录,只返回右表中的一个记录.我在下面列举了一个例子.我想避免使用子查询和临时表,因为实际数据大约是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)
如果您不关心返回的特定行。
select id, name, spent
from users
left join transactions on users.id = transactions.uid
group by id
Run Code Online (Sandbox Code Playgroud)
这将为每个用户返回一行。这将是第一个匹配的交易。
归档时间: |
|
查看次数: |
59301 次 |
最近记录: |