Hallo,
Es handelt sich um einen Monster-Select, der jetzt schon acht JOINS hat. Da wird der Ort dazugeholt, verwendete Sprachen und Übersetzungstabellen. Ich versuche, das Teilproblem herauszulösen:
id name ort_id ueber_id
0815 Aldi-Zentrale 13556 NULL
4711 Aldi Frankfurt 17342 0815
4712 Mustermann 16344 NULL
das sieht nach einer hierarchischen Beziehung aus. Hierarchische Beziehungen bereiten in relationalen Datenbanken durchaus Bauchgrimmen :-)
Wenn es nur zwei Ebenen gibt, dann könntest Du den zweiten Datensatz per Selfjoin bekommen. Wie ich im Dir bereits bekannten Artikel schreibe, skalieren Selfjoins nicht besonders gut:
Idee 1:
SELECT
id,
name,
ort_id,
ueber_id
FROM
tabelle
WHERE
id = 4711
liefert Dir die Aldi-Filiale in Frankfurt
Der Selfjoin:
SELECT
t1.id,
t1.name,
t1.ort_id,
t1.ueber_id
FROM
tabelle t1
INNER JOIN
tabelle t2
ON
t1.id = t2.ueber_id
WHERE
t2.id = 4711
liefert Dir die zugehörige Aldi-Zentrale zur Filiale in Frankfurt.
Die UNION beider Abfragen liefert Dir die beiden gewünschten Datensätze:
SELECT
id,
name,
ort_id,
ueber_id
FROM
tabelle
WHERE
id = 4711
UNION ALL
SELECT
t1.id,
t1.name,
t1.ort_id,
t1.ueber_id
FROM
tabelle t1
INNER JOIN
tabelle t2
ON
t1.id = t2.ueber_id
WHERE
t2.id = 4711
liefert die beiden gewünschten Datensätze
Alternativ könntest Du mit einer Subquery arbeiten:
SELECT -- Gib mir
id, -- den Datensatz
name,
ort_id,
ueber_id
FROM
tabelle
WHERE
id = 4711 -- bei dem die id 4711 ist
OR -- oder deren
id IN ( -- id in der
SELECT -- Liste der
t2.ueber_id -- Werte der ueber_ids
FROM -- aus
tabelle t2 -- der gleichen Tabelle enthalten ist
WHERE -- wobei nur die Datensätze betrachtet werden
t2.id = 4711 -- deren id-Wert 4711 ist
)
Sobald Du mehr als zwei Ebenen betrachten musst, dann solltest Du Dein Konzept der einfachen Adjazenzliste überdenken. Vielleicht käme das Nested-Set-Modell in Frage, vielleicht auch der Closure-Tree.
Das hängt durchaus von Deinen Daten und den typischen Operationen auf diesen Daten ab.
Freundliche Grüße
Vinzenz