Ivan: Mehrere Zeilen summieren und per JOIN verbinden?

Hallo,

ich hoffe, dass ich mit dem Titel einigermaßen richtig liege. Vielmehr noch hoffe ich, dass mir jemand von euch weiterhelfen kann, sofern es geht.

Ich habe folgende Problematik: Ich habe zwei Tabellen, wobei in der ersten alle Benutzer stehen und in einer zweiten Posts dieser Benutzer. Alle Post-Einträge haben einen Wert "Words", also die Anzahl der Wörter in diesem Post.

Was ich suche, ich ein Query, welcher mir alle User aus der Tabell holt (SELECT * FROM users) und gleichzeitig ein Feld mitselektiert, welches die SUMME über alle word-Spalten der post-Einträge des Benutzers enthält. Geht sowas?

Nochmal die Illustration:

Tabelle 1 (Benutzer)

ID - Name
1    Fritz
2    Berta
3    Wilhelm

Tabelle 2 (Posts)

ID - Autor - Text - Words
1    2       ...    433
2    2       ...    645
3    1       ...    213
4    3       ...    1077
5    3       ...    556

Und nochmal am Beispiel erklärt: Ich möchte jetzt in einem Query alle User selektieren und gleichzeitig ein Feld "wordsumme" hinzufügen, welches die Summe über ALLE Words-Felder der zweiten Tabelle, deren ID der jeweiligen User-ID entspricht.

Ich hoffe, dass war nicht zu wirr zu später Stunde und ihr könnt mir helfen ;)

Danke im Voraus,
Ivan

PS: Habe MySQL in Version 5.1.37

  1. Also Berta hat 1078 Words

    Nutze Joins, wobei du für die words ein Subtable einsetzt

    [code=sql]
    SELECT a.Spalte1, a.Spalte2, ... a.Spalten, b.Summe
    FROM tabelle1 AS a
    JOIN (
      SELECT SUM(words) AS Summe
      FROM tabelle2
      GROUP BY Autor
    ) AS b
    [/code]

  2. moin,

    Ich hoffe, dass war nicht zu wirr zu später Stunde und ihr könnt mir helfen ;)

    das zauberwort heißt korrelierte unterabfragen, die du in die abfrage über die Kunden mit einbaust.

    SELECT b.id, b.name
    (SELECT SUM(p.words) FROM posts p WHERE p.autor = b.id) AmzahlWoerter
    FROM benutzer b
    ;

    Ilja

  3. Das Ganze müsste in etwa so mit einem LEFT JOIN funktionieren:

    SELECT
      tab1.id,
      tab1.name,
      SUM(tab2.words) as summe
    FROM
      tab2
    LEFT JOIN
      tab1
    ON
      tab1.id = tab2.autor
    GROUP BY
      tab1.id

    Gruß, Dennis

    1. Hallo Dennis,

      SELECT
        tab1.id,
        tab1.name,
        SUM(tab2.words) as summe
      FROM
        tab2
      LEFT JOIN
        tab1
      ON
        tab1.id = tab2.autor
      GROUP BY
        tab1.id

      a) Nein.
      b) Warum sollte dies das gewünschte Ergebnis liefern?
      c) Was ist mit den Autoren, von denen noch keine Einträge in tab2 vorliegen?
      d) Code ohne Kommentare ist miserabler Code. [1], [2], [3], [4]

      Freundliche Grüße

      Vinzenz

      [1] von extrem seltenen Ausnahmen abgesehen.
      [2] Dies trifft auch auf Code von mir zu.
      [3] Dies trifft auch auf Code hiesiger Forumsgrößen zu.
      [4] Dies trifft auch auf Code renommierter Entwickler zu.

      1. Hallo Vinzenz,

        zu c) und d) gebe ich Dir vollkommen Recht. Hat ein Autor noch keine Einträge, erscheint er auch nicht. Und Kommentare sind auch immer sinnvoll.

        Aber warum funktioniert das grundsätzlich nicht? Ich habe beispielsweise eine Abfrage, die mir bei einem Tippspiel die Spieltage nach Anzahl der geschossenen Tore sortiert ausgibt:

        SELECT
        tippspiel_spieltage.spieltag,
        SUM(tippspiel_spiele.heim_ergebnis + tippspiel_spiele.gast_ergebnis) AS gesamt
        FROM
        tippspiel_spiele
        LEFT JOIN
        tippspiel_spieltage
        ON
        tippspiel_spieltage.id = tippspiel_spiele.spieltag_id
        LEFT JOIN
        tippspiel_saison
        ON
        tippspiel_saison.id = tippspiel_spieltage.saison_id
        WHERE
        tippspiel_saison.id = 7
        GROUP BY
        tippspiel_spiele.spieltag_id
        ORDER BY
        gesamt DESC

        Ist das nicht mit oben genannter Problemstellung - natürlich mit Ausnahme der Autoren ohne Beitrag - vergleichbar?

        Gruß, Dennis

        1. Mist, wieder Kommentare vergessen. Ich gelobe Besserung!

          Wenn's Fragen gibt, bitte melden.

          Gruß, Dennis

        2. Hallo,

          zu c) und d) gebe ich Dir vollkommen Recht. Hat ein Autor noch keine Einträge, erscheint er auch nicht. Und Kommentare sind auch immer sinnvoll.

          Aber warum funktioniert das grundsätzlich nicht?

          a) weil bei einem Autor ohne Einträge eine 0 erscheinen sollte, statt diesen
             potentiellen Autor unter den Tisch fallen zu lassen.
          b) weil Dir jedes andere Datenbankmanagementsystem außer MySQL statt eines
             Ergebnisses eine Fehlermeldung zurückliefert. Warum? Weil Du nicht nach
             tab1.name gruppiert hast. Nur MySQL ist so großzügig, Spalten in der
             Spaltenliste zu erlauben, über die weder aggregiert noch gruppiert wird.
             In Deinem Fall ist die Optimierung von MySQL ausnahmsweise sogar zulässig,
             da tab1.name sicher eindeutig von tab1.id abhängen wird.

          Warum ich b) erwähne? Weil b) hier oft zu Nachfragen führt, weil der Fragesteller nicht das Ergebnis erhält, das er glaubt, erhalten zum müssen und das er bei ein paar Testdatensätzen sogar erhalten hat.

          Freundliche Grüße

          Vinzenz

          1. Hallo,

            zu c) und d) gebe ich Dir vollkommen Recht. Hat ein Autor noch keine Einträge, erscheint er auch nicht. Und Kommentare sind auch immer sinnvoll.

            Aber warum funktioniert das grundsätzlich nicht?

            a) weil bei einem Autor ohne Einträge eine 0 erscheinen sollte, statt diesen
               potentiellen Autor unter den Tisch fallen zu lassen.

            Das gebe ich zu, wie vorher schon gesagt. Aber noch eine kurze Frage dazu: Sind verschachtelte SELECT-Abfragen, die ja augenscheinlich der einzige vernünftige Lösungsansatz sind, nicht erst in neueren SQL-Versionen möglich?

            b) weil Dir jedes andere Datenbankmanagementsystem außer MySQL statt eines
               Ergebnisses eine Fehlermeldung zurückliefert. Warum? Weil Du nicht nach
               tab1.name gruppiert hast. Nur MySQL ist so großzügig, Spalten in der
               Spaltenliste zu erlauben, über die weder aggregiert noch gruppiert wird.
               In Deinem Fall ist die Optimierung von MySQL ausnahmsweise sogar zulässig,
               da tab1.name sicher eindeutig von tab1.id abhängen wird.

            Das war mir so gar nicht bewusst, dass das lediglich bei MySQL so ist. Danke für den Hinweis!

            Warum ich b) erwähne? Weil b) hier oft zu Nachfragen führt, weil der Fragesteller nicht das Ergebnis erhält, das er glaubt, erhalten zum müssen und das er bei ein paar Testdatensätzen sogar erhalten hat.

            Wie Du sicher gesehen hast, bin ich neu im Forum. Da hab ich mir noch keine Gedanken drüber gemacht und muss mich erst noch dran gewöhnen.

            Gruß, Dennis

            1. Hallo Dennis,

              Aber noch eine kurze Frage dazu: Sind verschachtelte SELECT-Abfragen, die ja augenscheinlich der einzige vernünftige Lösungsansatz sind, nicht erst in neueren SQL-Versionen möglich?

              das hängt davon ab, was Du bei MySQL als neuer betrachtest. Subselects gibt's seit MySQL 4.1 - und diese Version ist auch schon seit Jahren tot, sogar der erweiterte Support ist inzwischen eingestellt.

              Das war mir so gar nicht bewusst, dass das lediglich bei MySQL so ist. Danke für den Hinweis!

              wenn Du hier mitliest, wird Dir das vermutlich öfter passieren. Das geht mir nicht anders.

              Warum ich b) erwähne? Weil b) hier oft zu Nachfragen führt, weil der Fragesteller nicht das Ergebnis erhält, das er glaubt, erhalten zum müssen und das er bei ein paar Testdatensätzen sogar erhalten hat.

              Wie Du sicher gesehen hast, bin ich neu im Forum.

              noch ein ganz herzliches Willkommen. Ich hoffe, Du wirst Dich an uns gewöhnen. Dazu das unübertreffliche Zitat von Chräcker Heller:

              "Uns gibt es nur mit Meinung und ungebetener Beratung."

              Freundliche Grüße

              Vinzenz