ligatabelle durch array sortieren

So ich hoffe ich hab alles bedacht:
Code:
SELECT 
	t.teamname,
	sum(s.heimpunkte) heimpunkte_gesamt,
	sum(s.gastpunkte) gastpunkte_gesamt,
	sum(s.spiele_heim) heimsaetze_gesamt,
	sum(s.spiele_gast) gastsaetze_gesamt,
	count(s.id) gespielte_spiele,
	(sum(s.heimpunkte) - sum(s.gastpunkte)) differenz
FROM
	spiele s,
	teams t
WHERE
	t.id = s.heimteam OR
	t.id = s.gastteam
GROUP BY
	t.id
ORDER BY
	differenz DESC,
	gespielte_spiele

Und ich hoffe natürlich auch das ich keinen Fehler gemacht habe :)
Solltest das Ergebnis mit deiner bisherigen Berechnung abgleichen...
Ist es das was du dir vorstellst?!

EDIT:
Habe wohl eine Differenz vergessen - aber die schaffste nun selbst, oder? :)

Ergebnis siehe Anhang
 

Anhänge

  • ligatabelle.JPG
    ligatabelle.JPG
    72,3 KB · Aufrufe: 19
Zuletzt bearbeitet:
jepp sieht schon sehr gut aus, nur wie bekomm ich nun noch 2 bedingungen in die WHERE abfrage? wenn ich es so mache:

Code:
WHERE
	t.liga_id =1,
                t.aktiv = 1,
	t.id = s.heimteam OR
	t.id = s.gastteam

bekomm ich einen sytaxfehler.

edit: ich seh aber grad das die berechnungen nicht stimmen. zumindest stimmen sie nicht mit der alten tabelle überein.
 
Zuletzt bearbeitet:
Und nochmal ich.
Gab wohl doch mehr Probleme als ich dachte :)

Deine bisherigen Abfragen stimmen auch noch nicht so ganz. Du gibst Teams Punkte wo sie eigentlich gar keine für bekommen.

Man darf ja nur die Heimpunkte werten wenn das Team nen Heimspiel hatte und nur Gastpunkte wenn das Team nen Gastspiel hatte.
Also so einfach mit OR ist da nichts weil dann bekommt das Team auch Heim oder Gastpunkte wenn es eigentlich auf der anderen Seite gespielt hat - verständlich?

Daher erstmal ein kleiner Query:
Code:
SELECT
	t.teamname,
	@heimpunkte_gesamt := (SELECT sum(s.heimpunkte) FROM spiele s WHERE s.heimteam = t.id GROUP BY t.id LIMIT 1) heimpunkte_gesamt,
	@gastpunkte_gesamt := (SELECT sum(s.gastpunkte) FROM spiele s WHERE s.gastteam = t.id GROUP BY t.id LIMIT 1) gastpunkte_gesamt,
	@heimspiele_gesamt := (SELECT sum(s.spiele_heim) FROM spiele s WHERE s.heimteam = t.id GROUP BY t.id LIMIT 1) heimspiele_gesamt,
	@gastspiele_gesamt := (SELECT sum(s.spiele_gast) FROM spiele s WHERE s.gastteam = t.id GROUP BY t.id LIMIT 1) gastspiele_gesamt,
	@spiele_gesamt := (SELECT count(s.id) FROM spiele s WHERE s.gastteam = t.id OR s.heimteam = t.id GROUP BY t.id LIMIT 1) spiele_gesamt,
	CONCAT(CAST(@heimpunkte_gesamt AS CHAR(5)), ' : ', CAST(@gastpunkte_gesamt AS CHAR(5))) punkte_zusammen,
	(@heimpunkte_gesamt - @gastpunkte_gesamt) punkte_differenz,
	CONCAT(CAST(@heimspiele_gesamt AS CHAR(5)), ' : ', CAST(@gastspiele_gesamt AS CHAR(5))) spiele_zusammen,
	(@heimspiele_gesamt - @gastspiele_gesamt) spiele_differenz
FROM
	teams t
GROUP BY
	t.id
ORDER BY
	punkte_differenz DESC,
	spiele_gesamt

Allerdings funktioniert aus irgend einem Grund das sortieren nicht.

Eventuell kann da noch jemand anders was zu sagen?
Liegt das an der Verwendung von Variablen?

Ergebnis wieder im Anhang!
EDIT:
Anhang stimmt nicht ganz weil bei spiele_gesamt nen sum statt count hatte - doof gelaufen :P
Aber Query wurde aktualisiert!

lg
 

Anhänge

  • ligatabelle2.jpg
    ligatabelle2.jpg
    58,3 KB · Aufrufe: 14
Zuletzt bearbeitet:
jepp sieht schon sehr gut aus, nur wie bekomm ich nun noch 2 bedingungen in die WHERE abfrage? wenn ich es so mache:

Code:
WHERE
	t.liga_id =1,
                t.aktiv = 1,
	t.id = s.heimteam OR
	t.id = s.gastteam

bekomm ich einen sytaxfehler.

edit: ich seh aber grad das die berechnungen nicht stimmen. zumindest stimmen sie nicht mit der alten tabelle überein.

Achso das liegt natürlich daran das du mehrer Bedingungen mit AND verknüpfen musst.
Würde dann so aussehen:

Code:
SELECT
	t.teamname,
	@heimpunkte_gesamt := (SELECT sum(s.heimpunkte) FROM spiele s WHERE s.heimteam = t.id GROUP BY t.id LIMIT 1) heimpunkte_gesamt,
	@gastpunkte_gesamt := (SELECT sum(s.gastpunkte) FROM spiele s WHERE s.gastteam = t.id GROUP BY t.id LIMIT 1) gastpunkte_gesamt,
	@heimspiele_gesamt := (SELECT sum(s.spiele_heim) FROM spiele s WHERE s.heimteam = t.id GROUP BY t.id LIMIT 1) heimspiele_gesamt,
	@gastspiele_gesamt := (SELECT sum(s.spiele_gast) FROM spiele s WHERE s.gastteam = t.id GROUP BY t.id LIMIT 1) gastspiele_gesamt,
	@spiele_gesamt := (SELECT count(s.id) FROM spiele s WHERE s.gastteam = t.id OR s.heimteam = t.id GROUP BY t.id LIMIT 1) spiele_gesamt,
	CONCAT(CAST(@heimpunkte_gesamt AS CHAR(5)), ' : ', CAST(@gastpunkte_gesamt AS CHAR(5))) punkte_zusammen,
	(@heimpunkte_gesamt - @gastpunkte_gesamt) punkte_differenz,
	CONCAT(CAST(@heimspiele_gesamt AS CHAR(5)), ' : ', CAST(@gastspiele_gesamt AS CHAR(5))) spiele_zusammen,
	(@heimspiele_gesamt - @gastspiele_gesamt) spiele_differenz
FROM
	teams t
WHERE
	t.liga_id = 1 AND
	t.aktiv = 1
GROUP BY
	t.id
ORDER BY
	punkte_differenz DESC,
	spiele_gesamt

Ergebnis dazu wieder im Anhang :D
 

Anhänge

  • ligatabelle3.jpg
    ligatabelle3.jpg
    34,1 KB · Aufrufe: 20
jetzt bin ich total verwirrt *gg*

wenn ich nun folgendes abfrage:

Code:
SELECT * 
FROM `spiele` 
WHERE gastteam =2

dann zeigt mir die spiele auf indenen das Team 2 Gastmannschaft war.

Punkte werden so gerechnet:
wenn Heim gewinnt:

Heim : Gast = 2:0

unentschieden:

Heim : Gast = 1:1

Deswegen muss ich ja bei jedem Eintrag jeder Mannschaft Punkte vergeben, auch wenns nur 0 sind.

Ich Probier jetzt mal den anderen Query von dir. Aber du hast mich schon einiges weiter gebracht, Thx!

edit: was mir aber noch auffällt ist, rein rechnerisch bei 27 spieltagen (tunieren) müsste bei einer 2er punkteverteilung immer 54 rauskommen wenn ich heimpunkte und gastpunkte zusammenzähle. tut es aber leider in keinem deiner beispiele.

edit 2:

wenn ich nun:

Code:
SELECT sum( heimpunkte ) AS heimplus, sum( gastpunkte ) as gastminus
FROM `spiele` 
WHERE heimteam = 2

und:

Code:
SELECT sum( gastpunkte ) AS heimplus, sum( heimpunkte ) as gastminus
FROM `spiele` 
WHERE gastteam = 2

mir ansehe, dann würde zumindest schon mal diese differenz stimmen.
heimteam = 2 --> 24 : 4 Punkte
gastteam = 2 --> 14 : 12 Punkte
-------------------------------------------------------
Ende: 38 : 16 Punkte
 
Zuletzt bearbeitet:
Na das ganze ist ja nicht nur für einen Spieltag sondern für alles.
Daher kann doch garnicht immer 54 rauskommen, oder? Sonst sind ja auch alle Mannschaften gleich stark und man könnte sich die Tabelle eh sparen...

Oder versteh ich was falsch?

Leider bringt dich das immernoch nicht so recht weiter weil die Sortierung nicht funktioniert. Frage mich allerdings warum...

Soll mal nen SQL-Experte was zu sagen ;)

lg
 
ich hab meinen vorrigen beitrag nochmal editiert.

kleines beispiel:

27 Spieltage a` 2 Punkte ergibt im endergebnis immer 54 ob ich jetzt am spieltag 1:1 oder 0:2 oder 2:0 vergebe.

10x 2:0 = 20
10x 0:2 = 20
07x 1:1 = 14
---------------------
ergibt: 54
 
Die Tabelle ist doch aber Mannschaftsbezogen und nicht Spieltagbezogen...

Mannschaft 1 0:2 Mannschaft 2
Mannschaft 3 0:2 Mannschaft 4

Mannschaft 1 1:1 Mannschaft 3
Mannschaft 4 2:0 Mannschaft 2

Ergebnis:
Mannschaft 1: 1:3
Mannschaft 2: 2:2
Mannschaft 3: 1:3
Mannschaft 4: 4:0
usw.

Oder verstehe ich das falsch?
 
Einen wunderschönen guten Morgen :)

klar ist die Tabelle Spieltag bezogen. Aber sie wird ja errechnet durch die Spiele der Mannschaften. Jede Mannschaft spielt ja an einem Spieltag, sprich 27 Spiele für jede Mannschaft. bei einer 2er Punkteverteilung kommt wiederrum 54 am Ende raus.

So wie ich auf der ersten Seite den letzten Beitrag editiert hatte müsste es eigentlich passen. Diese 2 Abfragen in eine Packen und natürlich den teamnamen, aktiv und liaga_id noch dazu.

edit:

folgender code bringt mich schon mal auf ein richtiges ergebnis:

PHP:
$sql = mysql_query("SELECT sum( heimpunkte ) AS heimplus, sum( gastpunkte ) as gastminus FROM `spiele` WHERE heimteam = 2") or die(mysql_error());
		while($res = mysql_fetch_array($sql)){
		
			$sql2 = mysql_query("SELECT sum( gastpunkte ) AS heimplus, sum( heimpunkte ) as gastminus FROM `spiele` WHERE gastteam = 2") or die(mysql_error());
			while ($res2 = mysql_fetch_array($sql2)){
			
				$heimplus = $res[heimplus] + $res2[heimplus];
				$heimminus = $res[gastminus] + $res2[gastminus];
							
			}
		
		}
		
		echo $heimplus." : ".$heimminus;

jetzt müsste ich halt diese Abfrage entweder zusammenfassen können und die 3 besagten Felder noch mit abfragen oder ich mache es in diesen Schleifen.
 
Zuletzt bearbeitet:
Also du musst mir nicht zuhören....

Guckmal hier:
Code:
$sql = mysql_query("SELECT sum( heimpunkte ) AS heimplus, sum( gastpunkte ) as gastminus FROM `spiele` WHERE heimteam = 2") or die(mysql_error());

Da bekommt das Team die Gastpunkte direkt mit, auch wenn es eigentlich das Heimteam war.

Wenn du mit der Lösung glücklich bist sag das und ich lasse die Finger vom Thread :)

lg
 
Zurück