Столбец сравнения SQL меняет последние X часов

У меня есть таблица с записями журнала, которая выглядит так:

id | name     | level |  timestamp
5  | ironman  | 35    |  2019-01-06 11:37:40
6  | ironman  | 35    |  2019-01-06 11:38:40
7  | ironman  | 36    |  2019-01-06 11:39:40
8  | superman | 25    |  2019-01-06 11:39:49

Мне нужна помощь в создании запроса, который возвращает список уровней, полученных за последние X часов для каждого персонажа, желательно отсортированных по полученному количеству. Итак, в этом примере я хотел получить следующий результат

id  |  name    |  gained  |  timestamp
7   | ironman  |  1       |  2019-01-06 11:37:40
8   | superman |  0       |  2019-01-06 11:37:40

проверьте временную метку супермена! Это нормально ?

CodeMan 06.01.2019 13:16
Освоение архитектуры микросервисов с 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
В предыдущей статье мы завершили установку базы данных, для тех, кто не знает.
2
1
42
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

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

Попробуйте выполнить агрегированный запрос, который сравнивает уровни MIN и MAX каждого символа:

SELECT 
    name,
    MAX(level) - MIN(level) as gained,
    MIN(timestamp)
FROM mytable
WHERE timestamp > NOW() - INTERVAL 1 HOUR
GROUP BY 
    name
ORDER BY 
    gained desc

NB: это предполагает, что level персонажа может только увеличиваться. Если уровень персонажа понижается, он все равно будет отображаться как прирост.

Это только кажется, что возвращает 0 при получении? Я дважды проверил и выровнял символы в моей базе данных.

user3127399 06.01.2019 13:30

@ user3127399: запрос по умолчанию ищет последний час (INTERVAL 1 HOUR), вам может потребоваться изменить это

GMB 06.01.2019 13:32

Да, я пробовал изменить его на 10 часов, но результат тот же

user3127399 06.01.2019 13:35

Поле level определено как числовое или как varchar?

GMB 06.01.2019 13:36

уровень - это int

user3127399 06.01.2019 13:41

@ user3127399: извините, у меня была опечатка в дате ... Исправлено!

GMB 06.01.2019 13:45

Вам нужно присоединиться к основной таблице с запросом, который рассчитывает изменение уровней:

select levels.id, t.name, t.gained, t.timestamp
from (
select 
    name,
    max(level) - min(level) gained,
    max(timestamp) timestamp
from levels
where timestamp > now() - interval 10 hour
group by name
) t inner join levels
on 
  t.timestamp = levels.timestamp
  and
  t.name = levels.name
where levels.timestamp > now() - interval 10 hour
order by t.gained desc, t.name

Я предполагаю, что метка времени в ожидаемом выводе, который вы опубликовали о superman, неверна и должна быть 2019-01-06 11:39:49.
См. демонстрация

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