У меня есть таблица с записями журнала, которая выглядит так:
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






Попробуйте выполнить агрегированный запрос, который сравнивает уровни 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: запрос по умолчанию ищет последний час (INTERVAL 1 HOUR), вам может потребоваться изменить это
Да, я пробовал изменить его на 10 часов, но результат тот же
Поле level определено как числовое или как varchar?
уровень - это int
@ user3127399: извините, у меня была опечатка в дате ... Исправлено!
Вам нужно присоединиться к основной таблице с запросом, который рассчитывает изменение уровней:
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.
См. демонстрация
проверьте временную метку супермена! Это нормально ?