Справка запроса MySQL JOIN: возвратите только одну строку из самой правой таблицы для каждой строки в крайней левой таблице

У меня есть две таблицы. Я хочу присоединиться к ним способом, что только одна запись в правильной таблице возвращается для каждой записи в левых большая часть таблицы. Я включал пример ниже. Я хотел бы избежать подзапросов и временных таблиц, как фактические данные о 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  |
---------------------
24
задан Mike Sherov 22 July 2010 в 21:23
поделиться

4 ответа

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

  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

Помните, что это вернет только пользователей, у которых есть хотя бы одна запись ТРАНЗАКЦИИ. Если вы хотите видеть пользователей, у которых нет подтверждающих записей, а также тех, у кого они есть, используйте:

   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
39
ответ дан 28 November 2019 в 23:34
поделиться

Если вам не важна конкретная строка, вы вернетесь.

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

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

2
ответ дан 28 November 2019 в 23:34
поделиться

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

1
ответ дан 28 November 2019 в 23:34
поделиться

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

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
0
ответ дан 28 November 2019 в 23:34
поделиться
Другие вопросы по тегам:

Похожие вопросы: