Hallo,
SELECT
node.payload
FROM
000node node
WHERE
node.lft BETWEEN (SELECT
parent.lft
FROM
000node parent
WHERE
parent.payload = 5895
)
AND (SELECT
parent.rgt
FROM
000node parent
WHERE
parent.payload = 5895
)
> in der Hoffnung, dass der Optimizer merkt, dass er die Subselects nur einmal auszuführen braucht (und zwei Subselects, wo mir eines lieber wäre, aber mir fällt gerade nichts ein, womit ich dieses umgehen könnte).
mit einem Join auf ein Subselect könnte ich es in der Tat umgehen :-)
~~~sql
SELECT
node.payload
FROM
000node node
INNER JOIN (
SELECT
lft,
rgt
FROM
000node
WHERE
payload = 5895
) parent
ON
node.lft BETWEEN parent.lft AND parent.rgt
Wiederum geht es ausschließlich darum, dem Query-Optimizer "von Hand" beizubringen, dass er aus "parent" nur einen einzigen Datensatz zu berücksichtigen braucht. Dieser Datensatz solle über einen Index effizient zu finden sein und die Auswahl der zurückzuliefernden Datensätze der Gesamtquery sollte mit Hilfe eines Indexes über die Spalte lft ebenfalls sehr performant erfolgen.
Freundliche Grüße
Vinzenz