Я делаю это так:
SELECT i.*, p1.*
FROM ingredients i
JOIN ingredient_prices p1 ON (i.id = p1.ingredient_id)
LEFT OUTER JOIN ingredient_prices p2 ON (i.id = p2.ingredient_id
AND p1.created_at < p2.created_at)
WHERE p2.id IS NULL;
При этом выполняется поиск цены (p2), которая является более поздней, чем p1, и, если ничего не найдено, p1 должна быть самой последней ценой.
Если существует возможность более чем одной цены на указанную дату, тогда вам нужен еще один термин, чтобы отфильтровать дубликат.