Как верно сгруппировать данные в запросе?

Есть набор id, по каждому из них индивидуально надо найти последнюю его запись. Такой вариант не проходит:

SELECT `good` AS `id`, `price`, `date` FROM `item_good_supplies` AS `s` WHERE `good` = (SELECT MAX(`date`) FROM `item_good_supplies` WHERE `good` = `s`.`good`) AND `good` IN('23068', '21805', '23204', '22493', '21813', '21802', '23845')

В чем затык? По отдельности сами запросы работают корректно.
  • Вопрос задан
  • 83 просмотра
Решения вопроса 1
Rsa97
@Rsa97
Для правильного вопроса надо знать половину ответа
Для MySQL 8.0 и выше.
WITH `cte` (`id`, `price`, `date`, `row`) AS (
  SELECT `good`, `price`, `date`, ROW_NUMBER() OVER `win`
    FROM `item_good_supplies`
    WHERE `good` IN('23068', '21805', '23204', '22493', '21813', '21802', '23845')
    WINDOW `win` AS (
      PARTITION BY `good`
      ORDER BY `date` DESC
    )
)
SELECT `id`, `price`, `date`
  FROM `cte`
  WHERE `row` = 1
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
@Arlekcangp
Разработчик, Лид, Архитектор ПО
Затык в том, что условие WHERE построено не верно. Вложенный запрос вернет MAX('date') и это дата, а сравнивается это значение с good (который как я понимаю id)
Я не знаю ваших данных, но предположу что в таблице item_good_supplies содержатся записи с одинаковым полем good и разной датой. В этом случае почему бы не воспользоваться group by ?:
SELECT `good` AS `id`, /* `price`, */ MAX(`date`) as `date` 
FROM `item_good_supplies` 
WHERE `good` IN('23068', '21805', '23204', '22493', '21813', '21802', '23845')
GROUP BY `good`


Update:
Как справедливо указал Rsa97 в комментарии, в этот запрос не получится впихнуть цену, т к good не является первичным ключом, а без этого необходимо указать price в group by, что приведёт к неверному результату. Если в таблице первичного ключа нет, то будет затруднительно составить запрос, который подставит корректную цену.
Ответ написан
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы