В вашем случае для подзапроса цен нужно использовать оконную функцию ранжирования списка, чтобы получить последнюю актуальную цену:
SELECT * FROM `products`
LEFT JOIN (SELECT `product`, `price`,
row_number() over (partition by `product` order by `id` desc) as price_rank
from `prices`) as prc on `products`.`id` = prc.`product`
and prc.price_rank = 1
limit 10
Но у вас, наверняка, версия mySQL не 8.x, а 5.x. В ней есть пользовательские переменные, которые позволяют создать патерн запроса, эмулирующий оконные функции.
SELECT * FROM `products`
LEFT JOIN (SELECT `product`, `price`,
IF(@prev_id <> `product`, @p_rank := 0, @p_rank),
@prev_id := `product`,
@p_rank := @p_rank + 1 as price_rank -- определяем partition
from `prices`,
(SELECT @p_rank := 0) p_rank, -- начальное значение ранга
(SELECT @prev_id := -1) prev_id -- начальное значение товара (не должен быть в диапазоне сущ. id)
order by `product` asc,
`id` desc -- устанавливаем сортировку partition
) as prc on `products`.`id` = prc.`product`
and prc.price_rank = 1
limit 10
PS: За точность воспроизведения аналога не ручаюсь, возможно, придется шаманить с order by в подзапросе.