Справка по запросу MySQL JOIN: возвращает только одну строку из крайней правой таблицы для каждой строки в самой левой таблице - PullRequest
22 голосов
/ 23 июля 2010

У меня есть две таблицы. Я хочу объединить их таким образом, чтобы для каждой записи в самой левой таблице возвращалась только одна запись в правой таблице. Я включил пример ниже. Я хотел бы избежать подзапросов и временных таблиц, так как фактические данные составляют около 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  |
---------------------

Ответы [ 4 ]

38 голосов
/ 23 июля 2010

Использование:

  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 голосов
/ 23 июля 2010

Если вас не волнует конкретная строка, которую вы получите.

select id, name, spent
from users
left join transactions on users.id = transactions.uid
group by id

Это вернет одну строку на пользователя.Это будет первая подобранная транзакция.

1 голос
/ 23 июля 2010

См. SO 3305709 для эквивалентного недавнего вопроса с рядом разумных ответов.Там указана СУБД Postgres, но различия здесь незначительны.

0 голосов
/ 23 июля 2010

Приношу свои извинения, если это на самом деле не отвечает на ваш вопрос.Похоже, вы пытаетесь увидеть, у каких пользователей есть хотя бы одна транзакция.Вы можете сделать это и в процессе увидеть, сколько каждый пользователь потратил, выполнив что-то вроде этого:

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...