Tach!
verstehe ich Dich richtig, dass das dann auf 5 Tabellen rausläuft?
Ja. 3 Tabellen für die Daten und zwei für die m:n-Beziehungen. Das ist die übliche Vorgehensweise bei m:n.
Aber das ist doch exakt das, was auch MudGuard vorgeschlagen hat. Und das hast Du doch kritisiert! Oder bezog sich Deine Kritik nicht auf die Art der Tabellen sondern darauf, dass er mit Joins arbeiten würde?
Erstens ja, und zweitens war meine Aussage zur Join-Lösung, dass diese potentiell zu viele Ergebnisse liefert, die man erst noch wegfiltern muss. Man kommt damit zum Ziel, aber mit Abzügen in der B-Note. Möglicherwiese hat diese Vorgehenswiese auch noch Nachteile bei großen Datenmengen, weil ein zu größes Zwischenergebnis produziert wird, falls der Optimizer nicht eingreift.
etwas einfacher formuliert, von innen nach außen: Wähle alle Gruppen-IDs aus der User-Gruppentabelle für die User-ID des gesuchten Users. Wähle alle Artikel-IDs aus der Artikel-Gruppen-Tabelle deren Gruppen-ID in der Ergebnismenge der vorhergehenden Abfrage ist. Wähle alle Artikel, deren ID in der Ergebnismenge der vorherigen Frage ist.
OK, ich bilde mir zwar ein, dass jetzt nach mehrmaligem Lesen von der Logik her verstanden zu haben, wie ich das jetzt mit Subqueries verwirklichen soll, ist mir leider nicht klar, da ich noch nie mit Subqueries gearbeitet 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. (Das ist auch noch ein Vorteil. Beim Join hat man nur einen großen Batzen, bei Subquerys kann man die Zwischenergebnisse einzeln testen. Also, nicht in jedem Fall, aber hier geht das.) Dann leg die Query kurz beiseite. Fang an mit dem nächsten Satz und beachte das unscheinbare Wörtchen "in". Das wird zu einem IN(...) und in die Klammern kommt die Subquery. Der dritte Satz folgt demselben Prinzip.
Vorsausgesetzt, ich habe Dich, was die Tabellen betrifft, richtig verstanden und ich möchte jetzt alle Artikeln aufgelistet bekommen, die für den User mit der ID '3' freigegeben sind (also sprich für die Gruppen, deren "Mitglied" er ist) ... wie müsste dann eine SELECT Anweisung aussehen?
Nun, das ist deine Hausaufgabe :-) Die Möglichkeiten von Subquerys sind recht vielfältig und entsprechend umfangreich das Subquery-Kapitel im MySQL-Handbuch. Aber eine Subquery im IN() ist vergleichsweise einfach zu verstehen. Statt einer kommaseparierten Menge einzelner Werte steht hier eine Subquery, die eine Ergebnismenge der Werte eines Feldes einer Tabelle liefert - zumindest in deinem Fall, ansonsten kann man das noch beliebig komplexer gestalten.
dedlfix.