AllesMeins: mySQL: Hilfe beim 'GROUP BY' statement

Hiho,

folgende Situation. Ich bastele gerade an einer Film_Datenbank. Dafür habe ich zwei mySQL Tabellen angelegt. In einer stehen die Filmdaten (mit einer eindeutigen ID) in der zweiten die Bewertungen für den Film (mit jeweils der passenden ID). Nun versuche ich diese beiden Tabellen zusammen zu bringen und die durchschnittliche Bewertung auszurechnen und scheitere am GRUOP BY Statement.

Mein Query sieht so aus:

SELECT filme.id, bew.id, filme.film_name, AVG(bew.gesamt) as gesamt FROM db_filme as filme, db_bewertungen as bew GROUP BY ???????? ORDER BY filme.id ASC

So. Für die ?????? habe ich schon verschiedene Sachen ausprobiert:

1.) GROUP BY filme.id
Das hatte zur Folge das zwar die Filmdaten richtig ausgegeben werden, allerdings wird zu jedem Film die selbe ID zurück gegeben und die Bewertung beträgt den Gesamtdurchschnitt alle Bewertungen und nicht nur der Bewertungen für den Film

2.) GROUP BY bew.id
ID und Bewertung stimmen zwar, dafür wird für jeden Film die selben Filmdaten (Name usw.) ausgegeben

3.) GROUP BY filme.id, bew.id
Damit wird jede mögliche Kombination ausgegeben. Sprich jeder Film mit jeder durchschnittlichen Bewertung aller Filme. In meinem Test-Fall habe ich also jeden Film 3 mal mit einmal der richtigen Bewertung und jeweils nochmal mit den Bewertungen der anderen Filme

4.) GROUP BY filme.id, = bew.id
Die Filmids werden richtig ausgegeben. Allerdings wird überall nur die Daten des ersten Filmes ausgegeben und dazu unterschiedliche vollkommen unsinnige Durchschnitts-Bewertungen bei denen ich beim besten Willen nicht darauf komme, wie die errechnet worden sein könnten.

So, und damit war ich mit meinem Latein am Ende. Bitte helft mir, wie muss das richtig heissen, ich habe wirklich keine Idee mehr.

Grüsse

Marc

  1. Hi,

    SELECT filme.id, bew.id, filme.film_name, AVG(bew.gesamt) as gesamt FROM db_filme as filme, db_bewertungen as bew GROUP BY ???????? ORDER BY filme.id ASC

    wie sind die beiden Tabellen miteinander verknüpft? Wenn Du keine entsprechende Bedingung angibst, erhältst Du in der Ergebnismenge ein Kreuzprodukt der beiden Tabellen, und diese Sätze werden dann aggregiert. Lies mal in der Doku nach unter dem Stichwort "Join".

    hth Robert

    1. Hiho,

      wie sind die beiden Tabellen miteinander verknüpft?

      Im Moment genau so wie es im Query angegeben ist. Ich meine das ist auch schon eine Verknüpfung (ein INNER JOIN???)...

      Lies mal in der Doku nach unter dem Stichwort "Join".

      Bringt mir jetzt auch herzlich wenig. Wenn du mir wenigstens verraten würdest welchen JOIN ich brauche... Keine Angst ich mache schon meine Hausaufgaben und versuche erst mich selber zu informieren bevor ich frage.

      Grüsse

      Marc

      1. Hi,

        wie sind die beiden Tabellen miteinander verknüpft?

        Im Moment genau so wie es im Query angegeben ist. Ich meine das ist auch schon eine Verknüpfung (ein INNER JOIN???)...

        ist mir auch bei nochmaligem Nachsehen nicht aufgefallen.

        Lies mal in der Doku nach unter dem Stichwort "Join".
        Bringt mir jetzt auch herzlich wenig. Wenn du mir wenigstens verraten würdest welchen JOIN ich brauche... Keine Angst ich mache schon meine Hausaufgaben und versuche erst mich selber zu informieren bevor ich frage.

        Auch wenn in dem anderen Posting ein expliziterer Hinweis steht, lies trotzdem! Es kann nichts schaden.

        hth Robert

      2. Hiho,

        wie sind die beiden Tabellen miteinander verknüpft?

        Im Moment genau so wie es im Query angegeben ist. Ich meine das ist auch schon eine Verknüpfung (ein INNER JOIN???)...

        Du hast momentan überhaupt keine Verknüpfung. Du musst den INNER JOIN schon hinschreiben.
        SELECT db_filme.id, db_bewertungen.id, db_filme.film_name, AVG(db_bewertungen.gesamt) as gesamt
        FROM db_filme INNER JOIN db_bewertungen ON db_filme.id = db_bewertungen.id
        GROUP BY db_filme.id ORDER BY db_filme.id ASC

        1. Hiho,

          alles klar, danke für die Hilfe - nun funktioniert es...

          Marc

  2. Das kann so auch nicht wirklich funktionieren:

    SELECT filme.id, bew.id, filme.film_name, AVG(bew.gesamt) as gesamt »»

    FROM db_filme as filme INNER JOIN db_bewertungen as bew ON filme.id = bew.id
    »»GROUP BY ???????? ORDER BY filme.id ASC

    Wenn du den INNER JOIN nicht machst, dann fehlt der Bezug zwischen den beiden Tabllen!