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