我有两张桌子。我希望以这样的方式加入它们:对于最左边的表中的每个记录,只返回右表中的一个记录。我在下面列举了一个例子。我想避免使用子查询和临时表,因为实际数据大约是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 |
---------------------
答案 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