MySQL Unterabfragen

danschwe

Grünschnabel
Hallo zusammen,

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
          ) 
  )
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.
 
Zuletzt bearbeitet:
Deine beiden Unteranfragen auf die TabelleB sind idetnisch.
Daraus resultiert, dass nur Daten angezeigt werden, in denen a2.seite = a2.ref ist.
Das macht wenig Sinn.
 
Nicht ganz, a2.seite und a2.ref müssen nicht in jeder Zeile gleich sein, sondern nur in der Ergebnismenge aus der Abfrage auf tabelleB enthalten sein.

Also wenn die innerste Abfrage 1,2,3 ergibt, dann werden auch Zeilen wie (Seite =1, Ref=2) genommen. Und so soll es an der Stelle auch sein.
Dass ich die innerste Abfrage identisch zweimal ausführe ist natürlich trotzdem mindestens unschön, aber ich weiß nicht, wie ich anders beide Bedingungen abfragen kann., Also sowohl a2.seite IN (...) als auch a2.ref IN (...).
 
Du könntest die innere Schleife so schreiben: (ungetestet)

Code:
SELECT a1.seite, a1.ref
FROM tabelleA as a1
WHERE a1.seite IN
   (SELECT a2.ref
    FROM tabelleA as a2
    WHERE (a2.seite, a2.ref) IN
         (SELECT b.seite, b.seite
           FROM tabelleB as b
           WHERE b.action = viewed AND b.objecttable = wiki_pages AND b.userid = 2
           )
  )
 
Das funktioniert so direkt leider auch nicht, weil er als Ausgabe der inneren Abfrage dann 2 Spalten erwartet.
Trotzdem danke für die Hilfe, ich habe es jetzt letztendlich über das php file gelöst, indem ich meine Abfragen auf mehrere Queries aufgeteilt habe. Ein bisschen umständlich, aber zumindest funktioniert es so.
 

Neue Beiträge

Zurück