@digdream

Mysql. Как выбрать записи по ближайшей дате?

Имеется таблица со свойствами вещей, самодостаточная:
storage(id,name,status,price,date_added,filial_id....)
данные например:
1,стол,1,4000,2015-01-07,...
2,стул,2,5000,2015-02-06,...

в ней есть переодические реквизиты, которые меняются со временем это например - поля status и price
Для того чтобы иметь возможность отслеживать эти атрибуты, была создана вторая таблица - состояний:
states (id,thing_id,status,price, state_change_date)
куда при каждой смене атрибута добавляется запись с текущими параметрами и датой смены
1,1,1,4000,2015-01-07
2,1,1,5500,2015-02-01
3,1,4,5500,2015-02-20
4,2,2,5000,2015-02-06

требуется - сделать отчет по всему хранилищу на определенную дату (да еще и по каждому статусу отдельно посчитать, но это частности)

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

запрос
select *,max(state_change_date) from states where state_change_date<="2015-02-01" group by thing_id

вернет со стороны max - правильный кортеж последних дат по отношению к заданной, а * выберет лишь первые записи, а не те у которых дата=макс_дате
  • Вопрос задан
  • 3370 просмотров
Решения вопроса 1
Rsa97
@Rsa97
Для правильного вопроса надо знать половину ответа
SELECT * 
    FROM `states` AS `s` 
    JOIN (
        SELECT `thing_id`, MAX(`state_change_date`) AS `date`
            FROM `states`
            WHERE `state_change_date` <= :request_date
            GROUP BY `thing_id`
    ) AS `d` ON `d`.`thing_id` = `s`.`thing_id` AND `d`.`date` = `s`.`state_change_date`
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
chlp
@chlp
фулстек
Вы пытаетесь выполнить 2 разные задачи одним запросом. * выбирает лишь «первые» записи, т.к. остальные уже были сгруппированы.
Просто сделайте 2 запроса вместо 1го:
select max(state_change_date) from states where state_change_date<="2015-02-01" group by thing_id
select * from states where state_change_date<="2015-02-01"


P.S. и хватит даты записывать строками "2015-02-01". Используйте специально отведенный тип данный www.mysql.ru/docs/man/DATETIME.html или уж на крайняк в int'е храните timestamp.
Ответ написан
Ваш ответ на вопрос

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

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