Hallo zusammen,
ich habe Schwierigkeiten mit folgender verschachtelten SQL-Abfrage:
Ich habe hier also eine obere, eine mittlere und eine doppelt genutzte innerste Abfrage. Die ersten beiden beziehen sich auf Tabelle A, die innerste auf Tabelle B. Diese innerste Abfrage gibt in meinem Beispiel die Werte 1, 2, 3, 9 aus.
Mein Problem ist nun:
Wenn ich statisch die innerste Abfrage durch diese Werte ersetze, wird mir genau das Gesamtergebnis ausgegeben, das ich haben möchte. Dabei reicht es sogar, nur die zweite innerste Abfrage zu ersetzen,
also:
"....
AND a2.ref IN (1,2,3,9)
)
"
Auch wenn ich die oberste Abfrage weg lasse, also eine Verschachtelung weniger nutze, treten keine Probleme auf.
Kann mir jemand erklären, woran dies liegen und wie ich die Abfrage korrigieren kann?
Und kann ich zb. die Bedingung für die innerste Abfrage geschickter ausführen, sodass ich die innerste Abfrage nicht doppelt durchführen muss?
Die Abfrage läuft außerdem über php, wäre es eventuell auch sinnvoll, meine SQL-Befehle in zwei Querys aufzuteilen und über php die entsprechenden Zwischenergebnisse ans nächste Query weiter zu geben?
Ich wäre dankbar für jede Hilfe.
MfG
Daniel
PS: Falls mehr Infos hilfreich sind, hier noch eine kleine Erläuterung, was ich eigentlich tun will:
Zugrunde liegt eine Wiki, deren Seiten miteinander verknüpft sind. Tabelle B enthält Infos darüber, welche Seiten sich ein Nutzer angesehen hat und Tabelle A zeigt an, welche Seiten im Wiki Links zu welchen anderen Seiten enthalten. Tabelle A hat also lediglich die Spalten ID, Seite und Ref. Eintrag (1, 3, 4) würde also bedeuten, dass Seite 3 eine Referenz zur Seite 4 enthält.
Die doppelt vorkommende innerste Abfrage (auf Tabelle B) liefert mir nun die angesehenen Seiten und die nächste Abfrage gibt mir an, welche Seiten mit diesen angesehenen Seiten direkt verknüpft sind. Von diesen neu ermittelten Seiten sollen in der obersten Abfrage dann erneut die entsprechenden Verknüpfungen abgerufen werden.
ich habe Schwierigkeiten mit folgender verschachtelten SQL-Abfrage:
Code:
SELECT a1.seite, a1.ref
FROM tabelleA as a1
WHERE a1.seite IN
(SELECT a2.ref
FROM tabelleA as a2
WHERE a2.seite IN
(SELECT b.seite
FROM tabelleB as b
WHERE b.action = viewed AND b.objecttable = wiki_pages AND b.userid = 2
)
AND a2.ref IN
(SELECT b.seite
FROM tabelleB as b
WHERE b.action = viewed AND b.objecttable = wiki_pages AND b.userid = 2
)
)
Mein Problem ist nun:
Wenn ich statisch die innerste Abfrage durch diese Werte ersetze, wird mir genau das Gesamtergebnis ausgegeben, das ich haben möchte. Dabei reicht es sogar, nur die zweite innerste Abfrage zu ersetzen,
also:
"....
AND a2.ref IN (1,2,3,9)
)
"
Auch wenn ich die oberste Abfrage weg lasse, also eine Verschachtelung weniger nutze, treten keine Probleme auf.
Kann mir jemand erklären, woran dies liegen und wie ich die Abfrage korrigieren kann?
Und kann ich zb. die Bedingung für die innerste Abfrage geschickter ausführen, sodass ich die innerste Abfrage nicht doppelt durchführen muss?
Die Abfrage läuft außerdem über php, wäre es eventuell auch sinnvoll, meine SQL-Befehle in zwei Querys aufzuteilen und über php die entsprechenden Zwischenergebnisse ans nächste Query weiter zu geben?
Ich wäre dankbar für jede Hilfe.
MfG
Daniel
PS: Falls mehr Infos hilfreich sind, hier noch eine kleine Erläuterung, was ich eigentlich tun will:
Zugrunde liegt eine Wiki, deren Seiten miteinander verknüpft sind. Tabelle B enthält Infos darüber, welche Seiten sich ein Nutzer angesehen hat und Tabelle A zeigt an, welche Seiten im Wiki Links zu welchen anderen Seiten enthalten. Tabelle A hat also lediglich die Spalten ID, Seite und Ref. Eintrag (1, 3, 4) würde also bedeuten, dass Seite 3 eine Referenz zur Seite 4 enthält.
Die doppelt vorkommende innerste Abfrage (auf Tabelle B) liefert mir nun die angesehenen Seiten und die nächste Abfrage gibt mir an, welche Seiten mit diesen angesehenen Seiten direkt verknüpft sind. Von diesen neu ermittelten Seiten sollen in der obersten Abfrage dann erneut die entsprechenden Verknüpfungen abgerufen werden.