Archiv verlassen und diese Seite im Standarddesign anzeigen : mehrere SUM() und COUNT() addieren
Hallo,
ich habe ein Problem und zwar will ich zwei SUM() und zwei COUNT() Ergebnisse addieren aber irgendwie kommt was raus was nicht stimmen kann. Hier mal meine mysql Query:
SELECT user.name, user.right_id,
SUM(group_bet.points+final_bet.points) AS sumPoints, COUNT(group_bet.bet_id+final_bet.bet_id) AS bets
FROM user
LEFT JOIN group_bet
ON group_bet.user_id = user.user_id
LEFT JOIN final_bet
ON final_bet.user_id = user.user_id
GROUP BY user.user_id
ORDER BY sumPoints DESC, bets DESC
Ich hoffe ihr versteht was ich erreichen will und könnt mir bei meinem kleinen Problem helfen...
MfG
Cappo
Welches Ergebnis bezweckst du mit COUNT()? COUNT(group_bet.bet_id+final_bet.bet_id) ergibt nämlich keinen Sinn.
eagle275 26-06-2010, 19:25 ich glaub er will damit ermitteln, wieviele Einzelgebote letztlich die sumPoints ergaben ...
dabei sollte er aber die Counts getrennt vornehmen .also ein Count für die normalen bets und einer für die final_bets .. ich glaub nicht, dass MySQL bei COunt mit einer Mischung aus 2 Spalten so klarkommt
Also in "bets" sollen zum Schluss alle Tipps (natürlich addiert) eines Users stehen und in "sumPoints" alle Punkte (natürlich addiert). Da aber jeweils die bets und die points in zwei verschiedenen Tabellen sind weiß ich nicht wie ich die in einer Query zusammenrechnen kann...
MfG
David
COUNT(group_bet.bet_id) + COUNT(final_bet.bet_id) ?
Hmmm bringt auch nicht das richtige raus...
onemorenerd 26-06-2010, 21:32 Vielleicht solltest du erstmal erklären, was du eigentlich erreichen willst. Wie man sieht, ist es keine so gute Idee, die Leute das von der Query ableiten zu lassen, die gar nicht das macht, was sie soll.
eagle275 26-06-2010, 22:18 mal so als bescheidene Frage warum stehen bei dir eigentlich gleichwertige Informationen (zumindest aus Sicht dieser Abfrage) in 2 verschiedenen Tabellen? könntest du die nicht in einer Tabelle erfassen?
Also...
ich habe unteranderem 2 Tabellen wo jeweils die Tipps (Bets) der User drin stehen...warum 2 Tabellen? in beiden Tabellen sind teilweise verschiedene Attribute (Spalten)...
nun will ich eine Rangliste der User machen die als erstes nach den gesamten Punkten der User und als zweites die Anzahl der Tipps ordnet (absteigend). Ich brauche dazu also die Gesamtpunkzahl und die Gesamtanzahl der Tipps jedes einzelnen Users.
Ich hoffe das hilft euch weiter...:(
MfG
David
eagle275 27-06-2010, 00:13 hmmm .. unterschiedliche Spalten....
machst du bei einem Tipp eines Users einen Eintrag nur in eine der Tabellen oder in beide? ..Dann wäre ja theoretisch die Abfrage auf eine der Tabellen ausreichend ... offensichtlich bist du ja selbst mit den Daten nicht zufrieden ...
Ich würde dir daher als Startpunkt empfehlen - Mach ein Selekt, dass dir vorerst alle Datensätze liefert - ohne Sum und Count .. und schau, ob du dabei alle Einträge erhältst, die du erwartest - danach kannst du dann mit Sum und Count die zusammenfassung machen .. logischerweise müsstest du dann ja das richtige ergebnis kriegen ...
hmmm .. unterschiedliche Spalten....
machst du bei einem Tipp eines Users einen Eintrag nur in eine der Tabellen oder in beide? ..Dann wäre ja theoretisch die Abfrage auf eine der Tabellen ausreichend ... offensichtlich bist du ja selbst mit den Daten nicht zufrieden ...
Ich würde dir daher als Startpunkt empfehlen - Mach ein Selekt, dass dir vorerst alle Datensätze liefert - ohne Sum und Count .. und schau, ob du dabei alle Einträge erhältst, die du erwartest - danach kannst du dann mit Sum und Count die zusammenfassung machen .. logischerweise müsstest du dann ja das richtige ergebnis kriegen ...
Bei einem Tipp kommt immer nur ein Eintrag in einer der beiden Tabelle (entweder group oder final)...ok werde die das mal ausprobieren was du geschrieben hast...
Bei einem Tipp kommt immer nur ein Eintrag in einer der beiden Tabelle (entweder group oder final)...ok werde die das mal ausprobieren was du geschrieben hast...
Also ich bins nochma, ;)
ich hab das nun probiert aber und es funktioniert soweit. ich habe nun ein Select gemacht wo ich alle Tipps der User bekomme und alle Punkte (nicht zusammengezählt)...aber wie mach ich das nun das ich diese nun für jeden einzelnen User zusammenzählen und somit ordnen kann?
MfG
David
eagle275 27-06-2010, 19:00 also ich würde das Zusammenrechnen dann doch lieber in PHP realisieren ..
wenn es denn absolut über die Datenbank sein soll .. Mach 2 getrennte Abfragen ..
eine berechnet SUM und COUNT jeweils für eine der beiden beteiligten Tabellen ..
dann muss dein PHP-Script - oder was auch immer du nimmst ja nur noch die beiden SUM und COUNT werte aus beiden Abfragen addieren.
SELECT user.name, user.right_id,
SUM(group_bet.points) AS sumPoints_1, COUNT(group_bet.bet_id) AS bets_1
FROM user
LEFT JOIN group_bet
ON group_bet.user_id = user.user_id
group by user.user_id
order by sumPoints_1 desc, bets_1 desc
und das ganze Analog für die Final_bets Tabelle
wobei .. es könnte einfacher sein, wenn du das vorher noch auf jeweils 1 User beschränkst ...
und wenn es denn in einer Abfrage sein soll .. du kannst mittels SUM und COUNT eigentlich immer nur die Werte einer Spalte behandeln - du müsstest also ein weiteres SUM(final_bets.points) AS sumPoints_2 und ein COUNT für die Final_Bets Tabelle da reinbauen -
die Ergebnisse müsstest du auch in der Abfrage auch direkt schon addieren dürfen mit SUM(x)+SUM(y) .. und ebenso bei den COUNTS
also ich würde das Zusammenrechnen dann doch lieber in PHP realisieren ..
wenn es denn absolut über die Datenbank sein soll .. Mach 2 getrennte Abfragen ..
eine berechnet SUM und COUNT jeweils für eine der beiden beteiligten Tabellen ..
dann muss dein PHP-Script - oder was auch immer du nimmst ja nur noch die beiden SUM und COUNT werte aus beiden Abfragen addieren.
SELECT user.name, user.right_id,
SUM(group_bet.points) AS sumPoints_1, COUNT(group_bet.bet_id) AS bets_1
FROM user
LEFT JOIN group_bet
ON group_bet.user_id = user.user_id
group by user.user_id
order by sumPoints_1 desc, bets_1 desc
und das ganze Analog für die Final_bets Tabelle
wobei .. es könnte einfacher sein, wenn du das vorher noch auf jeweils 1 User beschränkst ...
und wenn es denn in einer Abfrage sein soll .. du kannst mittels SUM und COUNT eigentlich immer nur die Werte einer Spalte behandeln - du müsstest also ein weiteres SUM(final_bets.points) AS sumPoints_2 und ein COUNT für die Final_Bets Tabelle da reinbauen -
die Ergebnisse müsstest du auch in der Abfrage auch direkt schon addieren dürfen mit SUM(x)+SUM(y) .. und ebenso bei den COUNTS
Also ich finde es besser wenn ich alles per DB Abfrage handlen kann da ich sonst das mehrdimensionale Array sortieren muss... ich habe nun folgende Abfrage mal probiert (wie du gesagt hast):
SELECT user.name, user.right_id, SUM(group_bet.points)
+ SUM(final_bet.points), COUNT(group_bet.bet_id) + COUNT(final_bet.bet_id)
FROM user
LEFT JOIN group_bet
ON group_bet.user_id = user.user_id
LEFT JOIN final_bet
ON final_bet.user_id = user.user_id
GROUP BY user.user_id
das Ergebnis sieht wiefolgt aus:
http://img84.imageshack.us/img84/848/dbabfrage.png (http://img84.imageshack.us/i/dbabfrage.png/)
Das kann nie sein...der zweite User von oben müsste 55 Punkte und 56 Tipps haben...
Auch wenn ich zwei SUMs seperat mache kommt auch nicht das richtige Ergebnis raus:
SELECT user.name, user.right_id, SUM(group_bet.points) as sumGroupPoints,
SUM(final_bet.points) AS sumFinalPoints, COUNT(group_bet.bet_id) AS groupBets,
COUNT(final_bet.bet_id) as finalBets
FROM user
LEFT JOIN group_bet
ON group_bet.user_id = user.user_id
LEFT JOIN final_bet
ON final_bet.user_id = user.user_id
GROUP BY user.user_id
Und hier die komischen Ergebnisse:
http://img413.imageshack.us/img413/1350/dbabfrage2.png (http://img413.imageshack.us/i/dbabfrage2.png/)
MfG
David
eagle275 27-06-2010, 20:12 hmmm .. ist das überhaupt ein Outer-Join (Left Join) ? .. sieht mir mehr nach nem EquiJoín aus ...
dann brauchst du einfach im Select alle Tabellen aufführen und dann ein
WHERE user.user_id=group_bets.user_id AND user.user_id=final_bets.user_id
im übrigen . was ist so abschreckend die beiden ergebnis-arrays mit dem Script auszuwerten, außer dass die Datenbank das bei korrekter Abfrage ein klitzekleines bißchen schneller schafft....^^
onemorenerd 28-06-2010, 03:03 ich habe unteranderem 2 Tabellen wo jeweils die Tipps (Bets) der User drin stehen...warum 2 Tabellen? in beiden Tabellen sind teilweise verschiedene Attribute (Spalten)...
Eine Spalte für mit 1 für bet oder 0 für final hätte es nicht getan?
nun will ich ... Ich brauche dazu also die Gesamtpunkzahl und die Gesamtanzahl der Tipps jedes einzelnen Users.
UNION!
Eine Spalte für mit 1 für bet oder 0 für final hätte es nicht getan?
hmm ja wenn ich das gewusst hätte was das für ein Zirkus wird dann hätte ich es wahrscheinlich so gemacht... ;)
So ha jetzt mal was mit UNION probiert:
(SELECT SUM(final_bet.points) AS sumPoints, final_bet.user_id, user.name,
COUNT(final_bet.bet_id) AS sumCount FROM final_bet
LEFT JOIN user
ON final_bet.user_id = user.user_id
GROUP BY final_bet.user_id)
UNION
(SELECT SUM(group_bet.points) AS sumPoints, group_bet.user_id,
user.name, COUNT(group_bet.bet_id) AS sumCount FROM group_bet
LEFT JOIN user
ON group_bet.user_id = user.user_id
GROUP BY group_bet.user_id)
ORDER BY sumPoints DESC
GROUP BY user_id
Ohne GROUP BY am Schluss kriege ich die Gesamtpunktzahl und die Anzahl aller Tipps jedes einzelnen Users...allerdings ist jeder User zweimal vorhanden (wegen den 2 SELECT's). Also hab ich einmal die Ergebnisse der "group_bet" und einmal die Ergebnisse der "final_bet"...nun wollte ich die Beiden jeweils zusammenfassen (mit GROUP BY user_id) allerdings sagt er mir dann:
#1064 - You have an error in your SQL syntax; check the manual that
corresponds to your MySQL server version for the right syntax to use near 'GROUP BY user_id' at line 11
eagle275 28-06-2010, 10:11 hmm.. UNION-Syntax
SELECT ...
UNION [ALL]
SELECT ...
[UNION
SELECT...]
Die SELECT Befehle sind normale Abfragen mit folgender Einschränkung:
- nur der letzte SELECT-Befehl darf INTO OUTFILE enthalten
- nur der letzte SELECT-Befehl darf ORDER BY enthalten
OHNE das Schlüsselwort ALL sind alle zurückgegebenen Datensätze eindeutig (unique) so, als hätten Sie ein DISTINCT für den gesamten Ergebnissatz ausgeführt...
das dürfte deine Fehlermeldung erklären - das Union selbst darf nicht Group / Order haben, sondern nur die Selects - und da halt nur das letzte..
es wundert mich allerdings dass du 2 Ergebnisse für den User bekommst - sieht danach aus, als ob deine Selects noch nicht so gut sind ..
JETZT GEHTS!
Endlich...danke an meinen Arbeitskollegen...er hat mir geholfen und folgendes vorgeschlagen (mit VIEW):
CREATE VIEW `userpoints`
AS (SELECT SUM(final_bet.points) AS sumPoints, final_bet.user_id, user.name,
COUNT(final_bet.bet_id) AS sumCount FROM final_bet
LEFT JOIN user
ON final_bet.user_id = user.user_id
GROUP BY final_bet.user_id)
UNION
(SELECT SUM(group_bet.points) AS sumPoints, group_bet.user_id, user.name,
COUNT(group_bet.bet_id) AS sumCount FROM group_bet
LEFT JOIN user
ON group_bet.user_id = user.user_id
GROUP BY group_bet.user_id)
ORDER BY sumPoints DESC
SELECT SUM(sumCount) AS finalcount, SUM(sumPoints) AS finalpoints, user_id, name FROM userpoints
GROUP BY user_id
ORDER BY finalpoints DESC, finalcount DESC
Danke an euch trotzdem für eure Hilfe und euren Einsatz!
MfG
David
|
-
- |