@lookingfor2

Как правильно написать оптимальный запрос?

settlements
  1. id | int(11) | PRIMARY KEY AUTO_INCREMENT
  2. user_id | int(11) | FOREIGN KEY
  3. period | timestamp
  4. rev | numeric(15,2)
  5. name | varchar
  6. status | varchar
  7. individual_guid | uuid


bank_props
  1. id | int(11) | PRIMARY KEY AUTO_INCREMENT
  2. user_id | int(11) | FOREIGN KEY
  3. is_active | boolean
  4. bik | varchar
  5. inn | varchar
  6. kpp | varchar
  7. individual_guid | uuid
  8. created_at | timestamp


users
  1. id | int(11) | PRIMARY KEY AUTO_INCREMENT
  2. name | varchar


Таблицы settlements и bank_props связаны с users отношением МНОГИЕ К ОДНОМУ.

1) Ответ должен получиться такого вида. Все лишние поля убрать.
{
  "bank_props": [
    {
      "bik": "string",
      "inn": "string",
      "kpp": "string",
      "individual_guid": "3fa85f64-5717-4562-b3fc-2c963f66afa6"
    }
  ],
  "settlements": [
    {
      "period": "2022-08-02T08:25:12.215Z",
      "individual_guid": "3fa85f64-5717-4562-b3fc-2c963f66afa6"
    }
  ]
}

2) Пользователей может быть десятки тысяч, запрос ограничен через LIMIT и OFFSET.
3) bank_props - последня запись(desc created_at) с is_active == true.
4) settlements - записи за месяц с определенным статусом(status == 'COMPLETED'). МЕСЯЦ достаем с последней записи(desc period).
  • Вопрос задан
  • 101 просмотр
Решения вопроса 1
iMedved2009
@iMedved2009
Не люблю людей
Я поэтому и задал этот вопрос, чтобы люди поделились опытом, подсказали как это лучше сделать

Что бы люди поделились - стоит облегчить им работу, таблицы отдать как create table, подготовить данные, и всякое такое. И тогда людям будет легче подсказывать и помогать

Тыц
select users.name, bank_props.bik, bank_props.inn, bank_props.kpp, bank_props.individual_guid, settlements.period
from users
         join
     (select max(period) as date, user_id from bank_props where active = true group by user_id) as t_bank
     on (users.id = t_bank.user_id)
         join bank_props on t_bank.user_id = bank_props.user_id and bank_props.period = t_bank.date
         join
     (select max(period) as date, user_id from settlements where status = 'COMPLETED' group by user_id) as t_settlements
     on (users.id = t_settlements.user_id)
         join settlements on t_settlements.user_id = settlements.user_id and settlements.period = t_settlements.date;
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

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