SQL-запрос, чтобы получить транзакцию для всех пользователей, имеющих определенную метку времени

У меня есть структура таблицы sql следующим образом:

id INT(11),
amount DOUBLE(10,2),
createdAt DATETIME,
user_id INT(11),
tx_status INT(11).

значение tx_status может быть 1 (кредит), 2 (дебет) и 3 (расчет). Теперь то, что я хочу, это все последние транзакции всех пользователей, где транзакция createdAt больше, чем последняя createdAt, когда tx_status = 3 для конкретного пользователя.

Данные показаны ниже:

id .  amount . createdAt .          user_id .      tx_status
112   500 .    2019-05-15 00:30:40  345 .          1
113 . 300      2019-05-16 06:45:29  345 .          2
116 . 600 .    2019-05-16 06:45:33  345 .          3
119 . 567 .    2019-05-17 07:56:55  345 .          1
121   500 .    2019-05-18 00:30:40  346 .          1
123 . 300      2019-05-19 06:45:29  346 .          2
124 . 600 .    2019-05-20 06:45:33  346 .          3
126 . 567 .    2019-05-21 07:56:55  346 .          1

Вывод должен быть:

id .  amount . createdAt .          user_id .      tx_status
119 . 567 .    2019-05-17 07:56:55  345 .          1
126 . 567 .    2019-05-21 07:56:55  346 .          1

Вы хотите увидеть, есть ли какие-либо дебеты или кредиты после последнего расчета?

P.Salmon 27.05.2019 14:17

да, и я хочу эти конкретные дебеты и кредиты после последнего расчета для каждого пользователя.

Mrugesh Thaker 27.05.2019 14:18
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
В последние годы архитектура микросервисов приобрела популярность как способ построения масштабируемых и гибких приложений. Laravel , популярный PHP...
Как построить CRUD-приложение в Laravel
Как построить CRUD-приложение в Laravel
Laravel - это популярный PHP-фреймворк, который позволяет быстро и легко создавать веб-приложения. Одной из наиболее распространенных задач в...
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
В предыдущем посте мы создали функциональность вставки и чтения для нашей динамической СУБД. В этом посте мы собираемся реализовать функции обновления...
Документирование API с помощью Swagger на Springboot
Документирование API с помощью Swagger на Springboot
В предыдущей статье мы уже узнали, как создать Rest API с помощью Springboot и MySql .
Роли и разрешения пользователей без пакета Laravel 9
Роли и разрешения пользователей без пакета Laravel 9
Этот пост изначально был опубликован на techsolutionstuff.com .
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
В предыдущей статье мы завершили установку базы данных, для тех, кто не знает.
0
2
62
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Этот запрос даст вам желаемые результаты. Он использует производную таблицу максимального времени расчетов, используя условную агрегацию, чтобы гарантировать, что, если расчеты не произошли, это время будет «1970-01-01» (так что будут возвращены все записи).

SELECT t1.*
FROM transactions t1
JOIN (SELECT user_id, MAX(CASE WHEN tx_status = 3 THEN createdAt ELSE '1970-01-01' END) AS last_settlement
      FROM transactions t2
      GROUP BY user_id) t2 ON t2.user_id = t1.user_id AND t2.last_settlement < t1.createdAt

Вывод (для ваших образцов данных)

id  amount  createdAt           user_id tx_status
119 567     2019-05-17 07:56:55 345     1   
126 567     2019-05-21 07:56:55 346     1

Демо на dbfiddle

Что делать, если транзакции со статусом = 3 нет?

Nick 27.05.2019 14:50

затем показать все транзакции для этого конкретного пользователя

Mrugesh Thaker 27.05.2019 14:53

В вашем образце данных есть несколько неверных моментов времени, но почему бы вам не включить обе транзакции, которые произошли после расчета для пользователя 345?

Nick 27.05.2019 14:54

Существует только одна транзакция с идентификатором 119 для идентификатора пользователя 345

Mrugesh Thaker 27.05.2019 14:57

id 113 имеет недопустимое время, которое больше, чем то, которое имеет tx_status=3. Возможно, вы могли бы исправить эти времена в примере данных

Nick 27.05.2019 14:58

@MrugeshThaker Я обновил свой ответ в соответствии с вашими новыми данными и требованием вернуть все записи для пользователя без расчетов.

Nick 28.05.2019 00:45

Другие вопросы по теме

Как связать несколько фреймов в Java
Как внедрить имена файлов изображений в базу данных mysql
PHP AJAX Delete Record - удаление работает только 1 раз
Как отобразить результат group_concat отдельно в ячейке таблицы html?
Запрос на вычитание одного и того же значения столбца с разным интервалом дня с базой данных SQL
Используйте CASE THEN в SQL
Первые 5 строк суммируются по ссылке для каждого типа, все остальные равны 1, сгруппированы по идентификатору команды
Как получить сгенерированный внешний ключ, созданный в MySQL, для использования в функции вставки
Ниже приведен код динамической формы, который может вставлять данные, добавляя несколько входных данных от пользователя в строку, но я хочу, чтобы они были в столбце. Как мне это сделать?
Java Spring Boot + Mysql — возвращает ответ Json (ключ-значение), когда результат запроса mysql не соответствует какой-либо модели, соответствующей какой-либо таблице базы данных