Использование пользовательского параметра var для хранения max (дата), а затем использовать его в предложении having

#mysql #mariadb #aggregate #var

#mysql #mariadb #агрегировать #var

Вопрос:

Мне нужно получить только последнее изменение цен на определенные продукты.

  • Я вернул все записи об изменениях цен для конкретных продуктов, сгруппированных по названию продукта
  • Я сохраняю максимальную дату изменения цены в пользовательском параметре var
  • Я сравниваю поле, в котором хранится дата изменения цены, с параметром в предложении having, чтобы получить последнее изменение цены

Но я просто возвращаю 0 строк

          SELECT  
            pr.product_id
            ,pr.price set_price
            ,pr.start_date -- the timestamp of price change
            ,date(max(pr.start_date))
            ,@'max_change' := max(pr.start_date)

        FROM prices pr

        where product_id in ( -- get the id's of specific products
                            ....                
            )

        group by pr.product_id

        having date(pr.start_date) = date(@max_change)
  

Комментарии:

1. Не заключать в кавычки @max_change . Избегайте @variables в SELECTs .

Ответ №1:

Вы могли бы использовать для этого коррелированный подзапрос, например

 drop table if exists member_token;
create Table member_token
(memberProfileId  int,createdAt date);

insert into member_token values
(1,'2019-01-01'),(1,'2019-01-01'),
(2,'2019-01-01'),(3,'2019-01-01'),
(1,'2019-01-02'),(2,'2019-01-02'),
(1,'2019-01-04'),(3,'2019-01-04');


select mt.*
from member_token mt
where createdat = 
(
select max(createdat)
from member_token mt1
where mt.memberprofileid = mt1.memberprofileid) 
order by memberprofileid
;

 ----------------- ------------ 
| memberProfileId | createdAt  |
 ----------------- ------------ 
|               1 | 2019-01-04 |
|               2 | 2019-01-02 |
|               3 | 2019-01-04 |
 ----------------- ------------ 
3 rows in set (0.00 sec)