выберите максимальную дату и время верните неправильные значения - PullRequest
0 голосов
/ 28 мая 2018

Я знаю, что есть много тем, связанных с этим.Я попытался исследовать их, но не смог понять это правильно.

У меня есть следующая таблица lunch_transaction:

id  |  user_id  |  date               |  due_amount  |  updated_on
---------------------------------------------------------------------------
1   |      145  | 2018-05-28 12:56:46 |   30.00      | 2018-05-28 12:56:46
2   |      134  | 2018-05-28 13:33:02 |   30.00      | 2018-05-28 13:33:02
3   |      134  | 2018-05-28 13:38:50 |   60.00      | 2018-05-28 13:38:50
4   |      134  | 2018-05-28 13:38:59 |   60.00      | 2018-05-28 13:38:59
5   |      134  | 2018-05-30 13:39:17 |   60.00      | 2018-05-28 13:39:17
6   |      145  | 2018-05-30 15:20:00 |   45.00      | 2018-05-28 15:00:17

Я хочу получить самую последнюю запись даты и времени для каждогоuser.

Следовательно, желаемый вывод должен быть следующим:

145  | 2018-05-30 15:20:00 |   45.00      | 2018-05-28 15:00:17
134  | 2018-05-30 13:39:17 |   60.00      | 2018-05-28 13:39:17

Но я получаю следующий вывод:

145  | 2018-05-30 15:20:00 |   30.00      | 2018-05-28 12:56:46
134  | 2018-05-30 13:39:17 |   30.00      | 2018-05-28 13:33:02

Даже значения столбца не соответствуютта же строка, т.е. кажется, что значения полей в наборе результатов смешаны из разных строк.

Вот мой запрос:

SELECT user_id, MAX(date), due_amount, updated_on 
FROM lunch_transaction 
GROUP BY user_id

Каким должен быть правильный запрос для достижения желаемого результата?

Ответы [ 2 ]

0 голосов
/ 29 мая 2018

Поскольку у вас есть столбец identity (id), вы можете воспользоваться им через subquery с предложением limit:

select lt.*
from lunch_transaction lt
where id = (select lt1.id
            from lunch_transaction lt1
            where lt.user_id = lt1.user_id
            order by date lt1.desc
            limit 1
           );
0 голосов
/ 28 мая 2018

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

SELECT t1.*
FROM lunch_transaction t1
INNER JOIN
(
    SELECT user_id, MAX(date) AS max_date
    FROM lunch_transaction 
    GROUP BY user_id
) t2
    ON t1.user_id = t2.user_id AND t1.date = t2.max_date;
...