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)
Wie Sie sehen, wiederhole ich dieselbe Unterabfrage, nur um eine weitere Spalte herauszubekommen. Ich frage mich, gibt es einen besseren Weg, dies zu tun?
id ist der Primärschlüssel in beiden Tabellen. Ich habe kein Problem damit, product_special.priority einzigartig zu machen, wenn das helfen kann.
cross apply
ist in Postgres ab Version 9.3 (Veröffentlichung 2013) verfügbar, sie haben sich jedoch dafür entschieden, den SQL-Standard einzuhalten und den Standardoperator zu verwendenlateral
. Ersetzen Sie in Ihrer zweiten Abfrageleft join
mitleft join lateral