#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)