Как правильно ОСТАВИТЬ пользователей с транзакциями - PullRequest
2 голосов
/ 17 апреля 2011
   SELECT *
     FROM users
LEFT JOIN payments ON payments.user_id = users.user_id
    WHERE payments.id = (SELECT max(p2.id) 
                           FROM payments p2 
                          WHERE payments.user_id = p2.user_id)

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

Моя структура таблицы, с которой я играю, очень проста:

USERS - user_id, name
PAYMENTS - id, user_id, method

Ответы [ 3 ]

2 голосов
/ 17 апреля 2011

Возможно, вам лучше (с точки зрения производительности) присоединиться к подзапросу, например так:

SELECT *
  FROM users u
LEFT JOIN 
(Select user_id, max(id) from payments group by user_id) p
ON p.user_id = u.user_id

Помещая любые условия в предложение Where, вы превращаете его во внутреннее соединение,

1 голос
/ 17 апреля 2011

попробуйте что-то вроде этого:

SELECT users.*, payments.*
  FROM users
LEFT JOIN payments ON payments.user_id = users.user_id
                  AND payments.id = (SELECT max(p2.id) 
                                       FROM payments p2 
                                      WHERE payments.user_id = p2.user_id)

У вас есть два столбца "user_id" в наборе результатов, один из таблицы пользователей и один из платежей. Payment.user_id будет нулевым, но users.user_id должен иметь значение.

0 голосов
/ 17 апреля 2011

Почему все делают такие сумасшедшие вещи?

select u.user_id u_uid, u.name, p.user_id p_uid, p.method from users u left join payments p on (u.user_id = p.user_id);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...