Справка MySQL JOIN query: возвращает только одну строку из самой правой таблицы для каждой строки в самой левой таблице
У меня две таблицы. Я хочу присоединиться к ним так, чтобы для каждой записи в левой таблице была возвращена только одна запись в правой таблице. Я привел пример ниже. Я хотел бы избежать подзапросов и временных таблиц, поскольку фактические данные составляют около 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 |
---------------------
Ответы
Ответ 1
Использование:
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
Ответ 2
Если вам не нужна конкретная строка, которую вы вернетесь.
select id, name, spent
from users
left join transactions on users.id = transactions.uid
group by id
Это приведет к возврату одной строки для каждого пользователя. Это будет первая согласованная транзакция.
Cheers,
Jacob
Ответ 3
См. SO 3305709 для эквивалентного недавнего вопроса с рядом разумных ответов. В СУБД упоминается Postgres, но различия здесь незначительны.
Ответ 4
Извиняюсь, если это не отвечает на ваш вопрос. Похоже, вы пытаетесь выяснить, какие пользователи имеют хотя бы одну транзакцию. Вы можете сделать это и в процессе посмотреть, сколько потратил каждый пользователь, выполнив что-то вроде этого:
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