Как создать mysql запрос к таблице истории записей?

Есть две таблицы - товары (products) и история товаров (products_history).
В первой таблице две колонки `product_id` и `date_created`, во второй хранятся остальные данные товара за определенную дату (колонки `product_id`, `is_current`, `version_date`, `name`, `stock_balance` и проч.) - версий одного товара может быть очень много за разные даты с разными данными. Актуальной может быть только одна версия, которая обозначается полем `is_current` = 1

Нужно создать запрос, который бы выбирал товары за определенную дату с остатком на складе (stock_balance) более 0.
Т.е. например, сегодня 20 августа, и нужно получить список товаров, с актуальными данными на 15 августа (чтобы остаток на складе, наименование и проч. были показаны за 15 августа), но при этом есть обязательное условие что у выборки у всех товаров stock_balance > 0.

Получилось создать вот такой запрос:

"SELECT 
products.product_id, 
products.date_created, 
products_history.name, 
products_history.version_date, 
products_history.stock_balance 
FROM products_table_name products INNER JOIN products_history_table_name products_history
ON products.product_id = products_history.product_id
WHERE products.product_id = 1
AND products_history.version_date < 2019-08-15 23:59:59  
ORDER BY products_history.version_date DESC LIMIT 1"


данный запрос получает актуальную версию товара по id за 15 августа, но не учитывает stock_balance. Вопрос - как изменить запрос, чтобы получить не один, а все товары, у которых stock_balance > 0.

Полагаю запрос должен выглядеть примерно так:

"SELECT 
products.product_id, 
products.date_created, 
products_history.name, 
products_history.version_date, 
products_history.stock_balance 
FROM products_table_name products INNER JOIN products_history_table_name products_history
ON products.product_id = products_history.product_id
WHERE products_history.version_date < 2019-08-15 23:59:59  
AND stock_balance > 0
ORDER BY products_history.version_date DESC LIMIT 100"


Однако такой запрос выведет ВСЕ версии ВСЕХ товаров до указанной даты, а нужно получить по одной версии для каждого товара с version_date наиболее близкой к указанной.

Заранее спасибо, если кто поможет решить задачку)
  • Вопрос задан
  • 81 просмотр
Решения вопроса 1
ivan3008
@ivan3008 Автор вопроса
решение - использовать GROUP BY:

"SELECT
products.product_id,
products.date_created,
products_history.name,
products_history.version_date,
products_history.stock_balance
FROM products_table_name products INNER JOIN products_history_table_name products_history
ON products.product_id = products_history.product_id
WHERE products_history.version_date < 2019-08-15 23:59:59
AND products_history.stock_balance > 0
GROUP BY products.product_id
ORDER BY products_history.version_date DESC LIMIT 100"
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

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

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