• Das Erstellen neuer Accounts wurde ausgesetzt. Bei berechtigtem Interesse bitte Kontaktaufnahme über die üblichen Wege. Beste Grüße der Admin

Nur bestimmte Werte zusammenrechnen (SUM)

Thomas-

New member
Hallo Leute,

ich habe ein Problem mit einer mysql Abfrage.

Ich habe zwei Tabellen
tippspiel_2009_tipppunkte
gp_id, user_ID, tipp_punkte

in der zweiten
tippspiel_2009_user
user_ID, user_name,syndicate_id

Derzeit frage ich die so ab. Damit wollte ich die Gesamtpunktzahlen berechnen, das klappt auch.

Code:
SELECT u.syndicate_id, u.user_name, IFNULL(sum(punkte.tipp_punkte),0) AS ges_punkte
	FROM tippspiel_2009_tipppunkte AS punkte
	LEFT JOIN tippspiel_2009_user AS u USING (user_ID)
	WHERE u.user_ID>9 GROUP BY u.user_ID ORDER BY ges_punkte DESC

Nun wollte ich aber nur die jeweils besten 3, die die selbe syndicate_id haben jeweils zusammen rechnen.weiß aber nicht wie ich das subselect in diesem Fall einbauen muss.


beispiel
tippspiel_2009_tipppunkte
gp_id, user_ID, tipp_punkte
AUS, 17, 30
BAH, 17, 26
CHI, 17, 4
AUS, 18, 13
BAH, 18, 6
GER, 18, 14
AUS, 19, 33
BAH, 19, 26
GER, 19, 4
AUS, 20, 31
TUE, 20, 21
GER, 20, 14
BRA, 21, 2
GER, 21, 6
TUE, 22, 9

tippspiel_2009_user
user_ID, user_name,syndicate_id
17, Ernst, 8
18, Fred, 3
19, EinToller, 4
20, Achim, 4
21, Bernd, 4
22, Hans, 4
 
Zuletzt bearbeitet:
Im Grunde will ich immer nur die besten 3Werte, die eine bestimmte syndicate_id haben, addieren wobei die Werte bereits Summen sind.
 
Ja, also das hatte ich ja schon gemacht, nur will ich ja mehr als 3 Datensätze, und die ges_punkte sind ja bereits errechnet.

Beim Beispiel würden sogar alle angezeigt werden
Ergebnis für dieses beispiel sollte sein:
syndicate_id, syn_punkte
4, 138
8, 60
3, 33

Wenn es mehr syndicate_id gibt, sollen die auch alle angezeigt werden.
Nur sollen immer nur die 3 höchsten ges_punkte für die syn_punkte herrangezogen werden.

user_ID 21 sollte also nicht mit in die syn_punte, da user_ID 22 die selbe syndicate_id (also 4) hat, aber die ges_punkte höher sind und bereits 2 datensätze die noch höhrere ges_punkte haben vorhanden sind.
 
Zuletzt bearbeitet:
Ich fasse nochmal alles zusammen:

Ich habe zwei Tabellen.

Tabelle1
tippspiel_2009_tipppunkte
gp_id, user_ID, tipp_punkte
AUS, 17, 30
BAH, 17, 26
CHI, 17, 4
AUS, 18, 13
BAH, 18, 6
GER, 18, 14
AUS, 19, 33
BAH, 19, 26
GER, 19, 4
AUS, 20, 31
TUE, 20, 21
GER, 20, 14
BRA, 21, 2
GER, 21, 6
TUE, 22, 9

Tabelle 2:
tippspiel_2009_user
user_ID, user_name,syndicate_id
17, Ernst, 8
18, Fred, 3
19, EinToller, 4
20, Achim, 4
21, Bernd, 4
22, Hans, 4

Ich möchte immer die 3 höchsten ges_punkte zusammenzählen und der syndicate_id zuordnen, diese dann noch nach der syndicate_id sortieren.

user_ID<10 sowie syndicate_id<1 soll ausgeschlossen werden. Die ges_punkte werden bereits ausgerechnet.

Meine derzeitige Abfrage:
Code:
SELECT syndicate_id, sum( ges_punkte ) AS syn_punkte
FROM (
  SELECT u.syndicate_id, u.user_name, IFNULL( sum( punkte.tipp_punkte ) , 0 ) AS ges_punkte
  FROM tippspiel_2009_tipppunkte AS punkte
  LEFT JOIN tippspiel_2009_user AS u
  USING ( user_ID )
  WHERE u.user_ID >9
  GROUP BY u.user_ID
  ORDER BY ges_punkte DESC
)points
WHERE syndicate_id >0
GROUP BY syndicate_id
ORDER BY syn_punkte DESC

Das Problem hierbei ist ich rechne alle ges_punkte zusammen, ich will aber halt nur aus jeder Gruppe die 3 maimalen Werte.

Ergebnis sollte dann in etwa so aussehen.

syndicate_id, syn_punkte
4, 138
8, 60
3, 33

jetzt ist es
syndicate_id, syn_punkte
4, 146
8, 60
3, 33
 
Zuletzt bearbeitet:
Habe es nun mit einer mehrfachen Verschachtelung und Schleifen im SQL Befehl gemacht. Sieht zwar unschön aus, aber es liefert das gewünschte Ergebnis. Hier ist nun jedoch noch eine dritte Tabelle drin, die aber sonst nur zur Verwirrung beigetragen hätte.

Code:
SELECT s.*, daten2.syndicate_id, SUM(daten2.tipp_punkte) AS tipp_punkte
  FROM 
       (SELECT daten.syndicate_id, daten.tipp_punkte, IF (@temp1 <> daten.syndicate_id, @rownum := 1, @rownum := @rownum +1) AS rownum, @temp1 := daten.syndicate_id
         FROM (SELECT  u.syndicate_id, u.user_name, SUM(punkte.tipp_punkte) AS tipp_punkte
                 FROM tippspiel_2_tipppunkte AS punkte
                 LEFT JOIN tippspiel_2_user AS u
                   ON punkte.user_ID = u.user_id
                WHERE u.user_ID >9    
                  AND u.syndicate_id > 0
               GROUP BY u.syndicate_id, u.user_name
               ORDER BY u.syndicate_id, tipp_punkte DESC) daten,
              (SELECT @rownum := 0, @temp1 := 0) init
       ) AS daten2
       LEFT JOIN tippspiel_syndicate AS s
       USING (syndicate_id)
  WHERE daten2.rownum < 4
GROUP BY daten2.syndicate_id
ORDER BY tipp_punkte  DESC
 
Zurück
Oben