@frmax
человек

Как оптимизировать запрос mysql?

Нужно сделать 1 запросом без вложенных запросов
Есть таблица `course` (`currency` enum(‘usd’, ‘eur’, ...), `price` float, `created_at` datetime) с курсами валют. В таблицу идет запись, как только изменился курс, путем добавления новой записи в конец. Курс по одной валюте может не меняться несколько дней, а по другой изменяться каждую минуту. Необходимо вывести актуальный курс валют. Список валют заранее не известен.

sqlfiddle.com/#!9/172f58/1
Вот тут описал структуру и вывел что должно получиться
  • Вопрос задан
  • 82 просмотра
Пригласить эксперта
Ответы на вопрос 2
Fragster
@Fragster
помогло? отметь решением!
select * from course where 
course.created_at = (select created_at from course as dates where dates.currency = course.currency order by created_at desc limit 1)

ну и индекс соответствующий (валюта + дата на убывание), как-то так:
CREATE INDEX age ON course(currency, created_at desc);

А вообще может быть лучше нормализовать + денормализовать, добавить таблицу валют, в которую добавить поле current_price и заполнять его при изменении курса? Ну, или сделать в таблице курсов флаг актуальной записи, сбрасывать его у предыдущей записи и устанавливать у последней? Тут может потребоваться "частичный" индекс, не знаю, поддерживает ли его мускуль.
Ответ написан
Rsa97
@Rsa97
Для правильного вопроса надо знать половину ответа
SELECT `n`.* 
FROM `course` AS `n`
INNER JOIN (
  SELECT `currency`, MAX(`created_at`) AS `created_at`
    FROM `course`
    GROUP BY `currency`
) AS `max` USING (`currency`, `created_at`);
Ответ написан
Ваш ответ на вопрос

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

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