SELECT
*,
p.name AS name,
p.image,
p.price,
(
SELECT ps.price
FROM product_special ps
WHERE p.id = ps.id
AND ps.date < NOW()
ORDER BY ps.priority ASC, LIMIT 1
) AS special_price,
(
SELECT ps.date
FROM product_special ps
WHERE p.id = ps.id
AND ps.date < NOW()
ORDER BY ps.priority ASC, LIMIT 1
) AS date
FROM product p LEFT JOIN product_special ps ON (p.id = ps.id)
Як ви бачите, я повторюю той самий підзапит, щоб вийти ще один стовпець. Мені цікаво, чи є кращий спосіб зробити це?
id - це первинний ключ в обох таблицях. Я не маю жодних проблем зробити product_special.priority унікальним, якщо це може допомогти.
cross apply
це доступно в Postgres , починаючи з 9.3 (випущена в 2013 році) , але вони вирішили дотримуватися стандарту SQL і використовувати стандартнийlateral
оператор. У своєму другому запиті замінітьleft join
наleft join lateral