Veröffentlicht 12. Januar 200520 j hi und hallo. ich möchte gerne eine fussballtabelle in php ausgeben. der clou daran soll sein, dass ich alle berechnungen schon im sql statement ausführe weil ich keine lust auf mehrere abfagen, oder php arrays habe. ich habe die tabelle spieltag die folgender massen aussieht: idSpieltag mannschaftsIDHome mannschaftsIDAway homeGoals awayGoals und die mannschaftstabelle id mannschaftsName kein wort über meine deutschEnglisch mix-technik so, und nun brauche ich ein sql-statement das folgendes macht: - für jede mannschaft - die tabelle spieltag durchgehen - bestimmen ob die mannschaft gewonnen hat (mehr tore als das andere team [vorsicht: heim/auswärts in welcher spalte steht die mannschaft???])ODER ob es ein unentschieden ist (gleiche anzahl tore beider mannschaften) - wenn die mannschaft gewonnen hat -> zu ihren "temporären" punkten 3 dazuzählen, wenn unentschieden dann 1 punkt dazu zählen - tore auch dazuzählen/abziehen - das ganze nach zuerst nach punkten, dann toren, dann siegen, dann unentschieden sortiert liefern puhh, da krampft mein gehirn irgendwann. vielleicht gibt es irgendwelche mysql befehle die ich nicht kenne die die ganze sache ganz trivial machen, oder geht es evtl. überhaupt nicht??? vielen dank
12. Januar 200520 j wie wärs denn mit ner stored precedure: http://dev.mysql.com/doc/mysql/en/Stored_Procedures.html
13. Januar 200520 j dann bleibt dir in mysql wohl nix anderes übrig, als ein php- oder anderes Skript für diese Auswertung zu schreiben, dass dann eine andere Tabelle der Datenbank immer entsprechend updatet. Auch wenn die das vielleicht nicht gefällt, fält mir sonst nix besseres ein. weil ich keine lust auf mehrere abfagen, oder php arrays habe. kannst ja mal bei deinem provider nachhacken, ob eventuell ein update auf mysql 5 vorgesehen ist
13. Januar 200520 j schade, aber natürlich ok. dachte nur daran das ganz elegant und einfach zu machen... beim provider dauerts leider noch laaaaange bis der mal umstellt. vielen dank!
13. Januar 200520 j puhh, da krampft mein gehirn irgendwann. vielleicht gibt es irgendwelche mysql befehle die ich nicht kenne die die ganze sache ganz trivial machen, oder geht es evtl. überhaupt nicht??? Also es gibt die SQL Anweisung CASE, die interessant sein könnte für dich. ausserdem gibt es in MySQL die Möglichkeit Variablen zu nutzen und diese in aufeinanderfolgenden SQL-Statements (mit ';' getrennt) zu verwenden. Ich find das im Moment nicht mehr, aber zu Variablen hab ich hier schonmal ne Antwort geschrieben irgendwo (da war ein Link zur Doku dabei). Kannst ja mal danach suchen. In einer SQL-Abfrage ist dein Problem nicht zu lösen, aber mit mehreren und den Variablen könnte es vielleicht gehen. Oder zumindest so, dass das Ergebnis schon fast das Ergebnis ist, was du willst.
14. Januar 200520 j Hallo zusammen, ich wär mir da nicht so sicher, ob man die Sache nicht doch in eine SQL-Abfrage packen kann. Ich kenn mich leider mit MySQL zu wenig aus, aber wenn man CASE und IF-Funktionen verschachteln kann, dann könnte ich mir das evtl. schon vorstellen... Gruss, Axl
14. Januar 200520 j Hier mein Vorschlag (ungetestet!): select m.mannschaftsName , count(*) anzahl_spieltage , sum(if (m.id = s.mannschaftsIdHome, if (s.homeGoals > s.awayGoals,3, if(s.homeGoals = s.awayGoals,1,0)), if (s.awayGoals > s.homeGoals, 3, if(s.awayGoals = s.homeGoals,1,0))) as punkte , sum(if (m.id = s.mannschaftsIdHome, s.homeGoals-s.awayGoals, s.awayGoals - s.homeGoals)) as torverhaeltnis from mannschaften m, spieltage s where m.id = s.mannschaftsIDHome or m.id = s.mannschaftsIdAway group by m.mannschaftsname order by 3,4 Ich glaube, zumindest von der Logik her müsste das passen. Die Sortierung nach gewonnenen Spielen, etc. hab ich jetzt mal weggelassen. Gruss, Axl
15. Januar 200520 j wow. da bin ich ja mal gespannt. ich werde das nächste woche mal ausprobieren. vielen dank!
17. Januar 200520 j sehr geil. wirklich! damit komme ich hin "if" hatte ich echt noch nicht gekannt in mysql. danke!
19. Januar 200520 j sehr geil. wirklich! damit komme ich hin "if" hatte ich echt noch nicht gekannt in mysql. danke! Wenn du mehr als nur 2 Fälle abdecken willst kann du in SQL auch mit einem CASE WHEN - Konstrukt arbeiten. Dies ist ähnlich einem "Switch Statement" http://dev.mysql.com/doc/mysql/en/CASE_Statement.html
20. Januar 200520 j ok, möchte hier gerne noch die getestete version veröffentlichen, damit endlich mal was fertiges zum thema im netz steht. ein paar umstände drin, aber ich habs immer gern ein bisschen ausführlicher. p.s. count as spieltage stimmt noch nicht, denn die spieltage müssen ja pro mannschaft angezeigt werden. eine mannschaft kann ja auch erst 6 spieltage haben während die andere 7 hat, aber dazu komme ich heute und die nächsten tage erstmal nicht ansonsten: SELECT m.mannschaftsName , count(*) as spieltage , sum( if (m.mannschaftsID = s.homeID, if (s.homeGoals > s.awayGoals,3, if(s.homeGoals = s.awayGoals,1,0)), 0) + if (m.mannschaftsID = s.awayID, if (s.homeGoals < s.awayGoals,3, if(s.homeGoals = s.awayGoals,1,0)), 0) ) as punkte , sum(if (m.mannschaftsID = s.homeID, s.homeGoals-s.awayGoals,0)) + sum(if (m.mannschaftsID = s.awayID, s.awayGoals-s.homeGoals,0)) as torverhaeltnis, sum(if (m.mannschaftsID = s.homeID, s.homeGoals,0)) + sum(if (m.mannschaftsID = s.awayID, s.awayGoals,0)) as torePlus, sum(if (m.mannschaftsID = s.homeID, s.awayGoals,0)) + sum(if (m.mannschaftsID = s.awayID, s.homeGoals,0)) as toreMinus, sum( if (m.mannschaftsID = s.homeID, if (s.homeGoals > s.awayGoals,1, 0), 0)) + sum(if (m.mannschaftsID = s.awayID, if (s.homeGoals < s.awayGoals,1, 0), 0)) as gewonnen, sum( if (m.mannschaftsID = s.homeID, if (s.homeGoals < s.awayGoals,1, 0), 0)) + sum(if (m.mannschaftsID = s.awayID, if (s.homeGoals > s.awayGoals,1, 0), 0)) as verloren, sum( if (m.mannschaftsID = s.homeID, if (s.homeGoals = s.awayGoals,1, 0), 0)) + sum(if (m.mannschaftsID = s.awayID, if (s.homeGoals = s.awayGoals,1, 0), 0)) as unentschieden from tbl_mannschaften m, tbl_spielplan s group by m.mannschaftsname vieln dank nochmal an axlHammer!!!
Archiv
Dieses Thema wurde archiviert und kann nicht mehr beantwortet werden.