Задать вопрос
Marusio
@Marusio

Как составить SQL запрос для подставления значения по времени?

Есть 2 таблицы

Сhange log :
id| old_state| new_state |date
1 | 34| 98| 2024-05-10
1 | 98| 65| 2024-05-13

id - айди переписки
old_state - старый статус
new_state - статус на который поменялся
date - когда статус поменялся

И
List :
id| date_massage| text
1 | 2024-05-11| Привет! Как дела?
1 | 2024-05-15 | Хеллоу! Все оки
История сообщений в переписке

Статусы меняются независимо от сообщений в переписке.

Задача видеть в каком статусе пришло то или иное сообщение, т.е. получить по итогу такое:
id| date_massage| text | state
1 | 2024-05-11| Привет! Как дела? | 98
1 | 2024-05-15 | Хеллоу! Все оки | 65
  • Вопрос задан
  • 75 просмотров
Подписаться 1 Простой 2 комментария
Пригласить эксперта
Ответы на вопрос 2
ThunderCat
@ThunderCat
{PHP, MySql, HTML, JS, CSS} developer
1) У вас во всех таблицах нарушен принцип уникальности записи. Айди, который должен однозначно идентифицировать запись, у вас означает что угодно кроме уникального айди.
2) Так как ваш лог не привязан к сущности сообщения через соответствующее отношение, то выборка будет показывать что угодно, кроме того что вам нужно.

Вывод: идите учите 1, 2 и 3 нормальные формы для начала. Потом нормально создайте таблицы. Потом скорее всего все вопросы сами отпадут, но если нет - вернетесь с нормальным вопросом.
Ответ написан
@DKSoft
В вопросе не указана БД (((
Для MySQL
select l.*
      ,(select new_status 
          from change_log ch
            where ch.id=l.id 
               and ch.date<=l.date_message 
                 order by ch.date desc 
                   limit 1) as state
 from List l

В общем случае
select l.*
      ,(select new_status
         from change_log ch 
          where ch.id=l.id 
              and ch.date=(select max(ch.date) 
                                    from change_log ch
                                      where ch.date<=l.date_message)
     ) as state
 from List l
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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