SQL MySQL Unterabfrage

danschwe

Newbie
Registriert
Juni 2017
Beiträge
4
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.
 
Was genau hättest du denn gerne als Ergebnis angezeigt?
Das sieht viel zu kompliziert aus für zwei Tabellen ;)
 
Also ich hab ja eine Spalte mit entsprechenden Seitenzahlen und eine zweite Spalte mit referenzierten Seitenzahlen.

Mit der ersten Abfrage wähle ich daraus eine gewisse Menge aus, erhalte also wieder die gleichen zwei Spalten,
nur mit reduzierter Zeilenmenge, also als beliebiges Bsp:

Seiten - Referenzen
1 - 3
1 - 4
2 - 6

Ich hab also die Seiten 1 und 2, wobei 1 Verweise auf die Seiten 3 und 4 und die Seite 2 einen Verweis auf Seite 6 enthält.

Und genau das gleiche will ich jetz auf der gleichen Tabelle erneut abfragen, also für die Seiten 3, 4 und 6 (also alle Einträge der Spalte Referenzen nach der ersten Abfrage) erneut abfragen, welche Verweise von diesen Seiten aus gehen. Das Endergebnis soll also wieder eine Spalte mit Seitenzahlen sein.
 
Versteh ich das richtig, du willst die die Refenrenzen der Referenzierten seiten anzeigen?

Also UserID 1 besucht Seite 1 mit Refenrenzen zu Seite 3 und 4.
Und die Abfrage soll jetzt ausgeben, welche Refenrenze Seite 3 und 4 haben?

Code:
select 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
    ) 
 )
 
Zuletzt bearbeitet:
Genau, richtig verstanden ;)

Dein Code ist ja auch identisch mit meinem außer dass du in der mittleren Abfrage die zweite Bedingung weg gelassen hast.
Aber genau da liegt mein Problem, die zweite Bedingung ist an der Stelle nötig, damit das raus kommt, was ich haben möchte.

Also sowohl a2.seite als auch a2.ref sollen in der Ergebnismenge der innersten Abfrage enthalten sein.
Ohne diese zweite Bedingung funktioniert alles, mit der zweiten Bedingung nicht mehr.
Wenn es möglich ist beide Bedingungen abzufragen ohne die innerste Abfrage zweimal auszuführen, würde das vielleicht schon reichen,
unschön ist das doppelte Aufrufen ja so oder so, aber anders habe ichs nicht hingekriegt. :(
 
Dann scheint mir das eher so zu sein, dass du wissen willst, ob ein User einer Referenz gefolgt ist.
Also wenn er auf Seite 1 mit Referenzen 3 und 4 war, ob er dann auch Seite 3 oder 4 Besucht hat?
 
Nicht ganz, läuft aber glaube ich aufs gleiche raus.

Das ganze soll Teil eines kleinen Empfehlungssystems sein und im ersten Schritt sollen eben nur die Seiten berücksichtigt werden, die der Nutzer sich in einem ersten Durchsehen des Wikis angesehen hat. Den Links muss er dabei nicht zwangsläufig gefolgt sein, er kann auch aus der Übersicht der Themen ein beliebiges ausgewählt haben.
 
Zurück
Oben