Mehrere Zeilen summieren und per JOIN verbinden?
Ivan
- datenbank
0 DiBo330 Ilja0 Der-Dennis0 Vinzenz Mai0 Der-Dennis
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
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]
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
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
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.
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
Mist, wieder Kommentare vergessen. Ich gelobe Besserung!
Wenn's Fragen gibt, bitte melden.
Gruß, Dennis
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
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
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