Подтвердить что ты не робот

Справка 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  |
---------------------
4b9b3361

Ответ 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