Hugo Egon Balder: MySQL SELECT Abfrage gesucht

Beitrag lesen

Hi dedlfix,

Nun, das ist deine Hausaufgabe :-)

es ist echt eine Frechheit von Dir, bei Aussentemperaturen von über 31 Grad Hausaufgaben zu geben, anstatt mir einfach die fertige Lösung hinzuschreiben! ;-) *g*

Danke, dass Du versucht hast, mir das halbwegs verständlich näherzubringen und es _könnte_ sein, dass ich es richtig verstanden habe. Deshalb möchte ich hier zu meiner Kontrolle Step by Step schreiben, was ich getan habe, um zu sehen, ob ich Dich eh richtig interpretiert habe:

Mach das mal schrittweise nach. Der erste Satz sollte nicht zu schwer sein. Die Query lass laufen und schau, dass sie das richtige Zwischenergebnis liefert.

Der erste Satz war:

Wähle alle Gruppen-IDs aus der User-Gruppentabelle für die User-ID des gesuchten Users.

Mein Query schaut so aus:

SELECT ug.gruppe
FROM user_in_gruppen AS ug
WHERE ug.user = 3

...und liefert (völlig korrekt) folgendes Ergebnis:

gruppe
------
2
3

Das stimmt. Der User 3 gehört zu den Gruppen 2 und 3.

Der 2. Satz war:

Wähle alle Artikel-IDs aus der Artikel-Gruppen-Tabelle deren Gruppen-ID in der Ergebnismenge der vorhergehenden Abfrage ist.

Und dazu sagtest Du bei Deiner letzten Antwort, ich soll das mit IN(...) lösen. Das war mir etwas klarer, als ich mir ein Beispiel dazu im Manual angesehen habe.

Ich schreibe also einen neuen Query, wo ich den funktionierenden der ersten Zeile als IN(...)-Bedingung einbaue. Mein Query schaut jetzt so aus:

SELECT ag.artikel
FROM artikel_fuer_gruppen AS ag
WHERE ag.gruppe IN ( SELECT ug.gruppe
                                  FROM user_in_gruppen AS ug
                                  WHERE ug.user = 3 )

...und liefert (völlig korrekt) folgendes Ergebnis:

artikel
-------
2
2
3
3
4
4
6
7

Zuerst habe ich nicht verstanden, wieso da die Artikeln 2, 3 und 4 doppelt gelistet werden. Aber es ist, wenn man nachdenkt, eh klar. Ein Mal werden die Artikel-IDs ausgegeben, weil sie für die Usergruppe 2 freigegeben sind und ein Mal, weil sie gleichzeitig auch für die Usergruppe 3 freigegeben sind. Also wieder ein richtiges Ergebnis.

Da ich natürlich keinen Artikel doppelt ausgeben möchte, kommt jetzt Dein 3. Satz ins Spiel:

Wähle alle Artikel, deren ID in der Ergebnismenge der vorherigen Frage ist.

Also auf gut Deutsch: Alle IDs, die bei der 2. Abfrage gefunden worden sind, _ein_ Mal ausgeben. Ich halte mich wieder an Deine mir vorgegebene Vorgehensweise mit dem IN(...) und baue wiederum den soeben verwendeten Query als IN(...)-Bedingung ein. Mein Query schaut jetzt so aus:

SELECT a.id, a.artikelname
FROM artikeln AS a
WHERE a.id IN ( SELECT ag.artikel
                FROM artikel_fuer_gruppen AS ag
                WHERE ag.gruppe IN ( SELECT ug.gruppe
                                     FROM user_in_gruppen AS ug
                                     WHERE ug.user = 3 ))

...und liefert (völlig korrekt) folgendes Ergebnis:

id | artikelname
----------------
2  | Ein Gedicht
3  | Restaurantkritik
4  | Berlinfotos
6  | Foo
7  | Bar

Und das ist _genau_ das, was ich wollte. Es werden exakt jene Artikeln Ausgegeben, die der User mit der id '3' auf Grund seiner Gruppenzugehörigkeiten sehen darf.

War das so in Deinem Sinne und habe ich meine Hausaufgabe jetzt so erfüllt, wie Du es Dir gewünscht hast?

Mit freundlichen Grüßen

Hugo Egon Balder