DISTINCT ON
и внешнее соединение - хороший подход, но я бы обработал это как:
SELECT . . . -- whatever columns you want
FROM products p LEFT JOIN
(SELECT DISTINCT ON (r.product_id) r.*
FROM reviews r
ORDER BY r.product_id, r.created_at DESC NULLS LAST
) r
ON r.product_id = p.id
ORDER BY p.price DESC NULLS LAST;
Разница в выполнении DISTINCT ON
до JOIN
или после может выглядеть незначительной. Но эта версия запроса может использовать индекс на reviews(product_id, created_at desc)
. И это может стать большим выигрышем в производительности для большого количества данных.
Индексы нельзя использовать для ORDER BY
, который смешивает столбцы из разных таблиц.