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
9.3(2013年にリリース)以降のPostgres で使用可能ですが、SQL標準に準拠し、標準lateral
演算子を使用することを選択しました。あなたの2番目のクエリで置き換えleft join
てleft join lateral