Komplizierte SQL-Abfrage



  • Hi Leute,
    ich bin in SQL eher unbedarft und versuche momentan etwas bestimmtes hinzubekommen:
    Angenommen ich habe 4 Tabellen.
    Tabelle 1: User
    Tabelle 2: Disziplinen
    Tabelle 3: Ergebnisse
    Tabelle 4: erweiterte User-Eigenschaften

    Zu einem Benutzer können 0..N Disziplinen zugeordnet werden.
    Zu jeder Disziplin können 0..N Ergebnisse zugeordnet werden.
    Zu jedem User können 0..1 erweiterte Eigenschaften zugeordnet werden.

    Jetzt will ich in diesen Datensätzen suchen. Es gibt einige Kriterien. Manche für Daten in Tabelle 1, manche für Daten in Tabelle 2, manche für 3 und manche für 4.
    Das Ergebnis soll sein:
    Der User-Name, wieviele Disziplinen er insgesamt absolviert hat und wieviele davon den Kriterien entsprechen.
    Ich habe es mit InnerJoins, GroupBy und Count versucht, aber das klappt nicht. Da bekomm ich nciht raus, wieviele Disziplinen er insgesamt absolviert hat und wieviele zu den kriterien passen 😞
    Hoffe das ist überhaupt über eine SQL-Anweisung möglich?



  • vielleicht sowas in der art?

    select u.name, d.name, count(u.id) from users u, disziplinen d, ergebnisse e where e.user_id = u.id and d.user_id = u.id and e.disziplin_id = d.id and (weitere kriterien...);

    vielleicht gehts auch als 2 oder mehrere selects...



  • Ne, das klappt nicht...
    Folgende SQL-Anweisung:

    SELECT users.ID, users.Name, Count(disciplines.ID)
    from users, disciplines
    where users.ID=disciplines.UserID
    group by users.ID, users.Name
    

    liefert mir die Anzahl aller Disziplinen zu einem User.
    Wenn ich aber Kriterien einbaue, die auf die Tabelle results zugreift, dann stimmt die Anzahl nicht mehr:

    SELECT users.ID, users.Name, Count(disciplines.ID)
    from users, disciplines, results
    where users.ID=disciplines.UserID AND disciplines.ID=results.disciplineID
    group by users.ID, users.Name
    


  • puh, kann eigentlich keinen Fehler feststellen.
    d.h. Sofern du nur die User willst die ein result in ihren Disziplinen haben und die menge dieser disziplinen aufgelistet haben willst



  • grr sry für doppelpost aber die komische Firewall oder was auch immer hier hat mir gesagt das mein post beim erstenmal nicht durchkam
    😡 😡 😡



  • Genau.
    Der Fehler ist mir eigentlich klar:
    Angenommen, ich habe einen User zu dem 3 Disziplinen gehören. Zu Disziplin 1 gehört 1 Ergebnis, zu Disziplin 2 gehören 2 Ergebnisse und zu Disziplin 3 gehören 3.
    Dann liefert mir meine zweite Abfrage ja jedes Ergebnis auch noch mit zurück. Sieht man sehr schön, wenn man folgendes macht:

    SELECT users.ID, users.Name, disciplines.ID, results.ID
    from users, disciplines, results
    where users.ID=disciplines.UserID AND disciplines.ID=results.disciplineID
    

    Die Ausgabe ist dann:

    users.ID, users.Name, disciplines.ID, results.ID
    1         Foo Bar     1               1
    1         Foo Bar     2               2
    1         Foo Bar     2               3
    1         Foo Bar     3               4
    1         Foo Bar     3               5
    1         Foo Bar     3               6
    

    Echt doof...



  • Mhmh mein SQL ist tierisch eingerostet aber

    SELECT users.ID, users.Name, disciplines.ID
    from users, disciplines
    where users.ID=disciplines.UserID AND disciplines.ID=results.disciplineID group by users.ID, users.Name
    

    versuchs mal so. Bin mir nicht sicher ob du die result Tabelle angeben musst wenn du sie nicht anzeigen willst.



  • Ich kann's gerade nicht testen, aber ich bezweifle, dass das funktioniert. Aus dem einfachen Grund, dass results nicht in der from-Anweisung steht, aber in der where-Anweisung...



  • hm wie gesagt bin zu eingerostet, kann dir da leider nicht helfen



  • dEUs schrieb:

    Ich kann's gerade nicht testen, aber ich bezweifle, dass das funktioniert. Aus dem einfachen Grund, dass results nicht in der from-Anweisung steht, aber in der where-Anweisung...

    Stimmt auf jeden Fall schon mal.

    Hast Du es schon mal mit einem COUNT (DISTINCT disciplines.ID) AS xxx versucht?



  • @Joe:
    Das gibt einen Syntaxfehler... DISTINCT darf ich an dieser Stelle nciht verwenden.

    @Taelan:
    Kein Problem, trotzdem danke.



  • Schade. Ich bin hier im Moment etwas im Streß... Aber vielleicht kann ich nachher mal in Ruhe schauen. Sonst morgen.



  • Das wäre super. Dank dir!



  • Achja falls du nur mal Befehle ausprobieren willst und dafür nicht immer die Befehle in deinem Prog ändern willst bzw dich zu den befehlen durchklicken oder was auch immer hier ein Prog:
    DBDude

    wurd mal von nem Studenten an meiner FH in Java programmiert, obs nützlich ist überlass ich dir ^^

    Zum rumprobiern taugts zumindest was



  • Hi DEUs,

    irgendwie habe ich hier den Faden verloren... Welche Felder möchtest Du in Deinem Select haben? Den Namen und die ID-Counts der anderen Tabellen?



  • Ich möchte den Namen und die Anzahl der Disziplinen die den Kriterien entsprechen.



  • Dann mach es doch per Subselect.

    SELECT
    users.ID, 
    users.Name, 
    count (disciplines.ID)
    from users, disciplines
    where users.ID=disciplines.UserID 
    AND disciplines.ID IN
      SELECT disciplineID
      FROM results
      WHERE results.disciplineID = users.ID 
    group by users.ID, users.Name
    

    Sollte eigentlich so funktionieren, habs aber nicht getestet.



  • Ach das geht ?! Genau sowas habe ich mir schon überlegt, aber dachte nciht, dass das tut. Da siehst mal, wie wenig Ahnung ich von SQL hab 🙄
    Tausend Dank! 👍 👍



  • Kommt auf die Datenbank an!

    MfG SideWinder



  • @SideWinder: Welche können es denn nicht? Mir fällt so spontan nur MySQL ein, aber seit Version 4 (?) sollte auch MySQL das können.

    @dEUs: Gerne geschehen. Was hast Du denn für eien DB? Schon ausprobiert, ob Subselects funktionieren?


Anmelden zum Antworten