ligatabelle durch array sortieren

Maniac

Erfahrenes Mitglied
Ich habe mich jetzt schon Stunden durchs Internet gelesen und ich komme einfach nicht dahinter.

Ich möchte eine Ligatabelle nach mehreren Kriterien sortieren.

1. Kriterium: nach Punkten
2. Kriterium: wenn Punktegleichheit dann nach gespielten Tunieren (wer weniger Tuniere hatte aber gleiche Punktezahl soll nach vorne)
3. Kriterium: wenn die anderen 2 Kriterien gleich sind soll noch Spielsätzen (Differenz)sortiert werden (bessere Differenz nach vorne)

Bis dato wird das Array welches mir die Ergebnisse liefert per ksort sortiert. Welches aber nur nach einem Schlüssel sortiert.

Mit usort komm ich noch nicht zurecht, habe keine Idee wie ich das mache.
kann mir da vielleicht helfen?

hier das array:

Code:
array (
  1 => 
  array (
    'Team' => 'Bären 3',
    'Punkte' => ' 2 : 52 ',
    'Diffpunkte' => '-50',
    'Spiele' => ' 134 : 352 ',
    'Diffspiele' => '-218',
    'Tuniere' => '27',
  ),
  2 => 
  array (
    'Team' => 'Overclocks',
    'Punkte' => ' 38 : 16 ',
    'Diffpunkte' => '22',
    'Spiele' => ' 278 : 208 ',
    'Diffspiele' => '70',
    'Tuniere' => '27',
  ),
  3 => 
  array (
    'Team' => 'Teenies und Opa',
    'Punkte' => ' 27 : 27 ',
    'Diffpunkte' => '0',
    'Spiele' => ' 253 : 233 ',
    'Diffspiele' => '20',
    'Tuniere' => '27',
  ),
  4 => 
  array (
    'Team' => 'Mighty Darts',
    'Punkte' => ' 22 : 32 ',
    'Diffpunkte' => '-10',
    'Spiele' => ' 222 : 264 ',
    'Diffspiele' => '-42',
    'Tuniere' => '27',
  ),
  5 => 
  array (
    'Team' => 'Domino Uhus',
    'Punkte' => ' 21 : 33 ',
    'Diffpunkte' => '-12',
    'Spiele' => ' 212 : 274 ',
    'Diffspiele' => '-62',
    'Tuniere' => '27',
  ),
 
Jja kommen sie, aber aus insgesammt 3 Abfragen. ich habe es schon versucht zusammenzufassen aber es auch nicht hinbekommen. Problem ist, das ich es schonmal anders hatte per MySQL und es auch sortiert hatte, nur hatte ich dann probleme mit der generierung eines PDF's.

Ich hänge die Datei hier mal an.
 

Anhänge

Sorry aber so ein rießen Quelltext nachzugucken hab ich im Moment kein nerv zu.

Es gibt ORDER BY (Feld1, Feld2, ...) DESC - http://sql.1keydata.com/de/sql-order-by.php :

Code:
SELECT * FROM tabelle WHERE bedingung ORDER BY (punkte, spiele, ...) DESC

Und wenn es aus mehreren Tabellen kommt gibt es JOIN - http://www.e-mana.de/4/sql.php?p=join :

Code:
SELECT * FROM tabelle1 INNER JOIN tabelle2 ON tabelle1.ID = tabelle2.ID WHERE tabelle1.feld = bedingung ORDER BY (tabelle1.punkte, tabelle2.spiele)

Wie auch immer du es haben willst. Wenn du die Struktur der Tabellen sagst schafft es vllt sogar einer hier die passenden Querys dazu zu schreiben.
 
Jja kommen sie, aber aus insgesammt 3 Abfragen. ich habe es schon versucht zusammenzufassen aber es auch nicht hinbekommen. Problem ist, das ich es schonmal anders hatte per MySQL und es auch sortiert hatte, nur hatte ich dann probleme mit der generierung eines PDF's.

Ich hänge die Datei hier mal an.

Das kann man sicher zu einer Abfrage zusammenfassen.
Dadurch würden dein Quelltext nicht nur entschieden kürzer, sondern auch übersichtlicher ;)

Würde mich da eher dran setzten bevor ich anfange so kompliziert zu sortieren.

lg
 
das übersteigt meine sql-kenntnisse leider. ich bin mir nicht sicher ob ich einen subselect benötige.

hier sind die 3 abfragen:

PHP:
"SELECT * FROM `teams` WHERE liga_id=".intval($liga)." AND aktiv=".intval(1)"

resultierend aus dem 1. select das hier:

PHP:
"SELECT * FROM `spiele` WHERE `heimteam`=".intval($teams['ID'])." OR `gastteam`=".intval($teams['ID'])"

und noch die anzahl der gespielten Tuniere:

PHP:
"SELECT COUNT(ID) as spiele FROM `spiele` WHERE `heimteam`=".intval($teams['ID'])." OR `gastteam`=".intval($teams['ID'])"

mein zusammengefasster Select sieht so aus, funktioniert aber auch nicht *g*:

PHP:
"SELECT a.*, COUNT(b.ID) as spiele, b.* FROM teams a LEFT JOIN spiele b ON a.ID=b.heimteam WHERE liga_id=$liga AND aktiv=1 AND a.ID= (SELECT * FROM spiele WHERE heimteam OR a.ID=gastteam)"

Fehlermeldung: Operand should contain 1 column(s)
 
Nur was mir direkt auffällt:

AND a.ID = (SELECT * FROM spiele WHERE heimteam OR a.ID=gastteam)

das fällt mir schonmal auf. Hier vergleichst du ein einziges Feld mit einer ganzen Zeile:

a.ID = alle (*) Felder FROM spiele ... geht natürlich nicht.

Also nur `ID` oder entsprechendes statt * verwenden.

Zudem hast du im WHERE stehen: heimteam OR a.ID =gastteam
Was ist die Bedingung für Heimteam?
 
schweift jetzt zwar vom eigentlichen thema PHP ab, ich mach jetzt kein neues Thema auf deswegen.

du hast natürlich recht, es sollte eigentlich a.ID=heimteam OR a.ID=gastteam heisen.

ich erläutere jetzt mal die tabelle spiele:

die Mannschaft mit der "ID 2" aus der Tabelle teams kann Heimteam oder auch Gastteam sein. Es müssen also alle Einträge geholt werden welche als Heimteam die "ID2" und als Gastteam die "ID2" haben. Dazu müssen die spalten "liga_id, teamname" über die Tabelle "teams " geholt werden.

Und da MySQL auch so schön rechnen kann, die Differenzen zwischen den einzelnen werten gleich mit. Aber das hätte ich danach gemacht, vorrang hätte erstmal das ich die Abfrage so hinbekomme das ich überhaupt einen Ansatzpunkt habe.

Im Anhang die Tabelle "spiele"
 

Anhänge

  • spiele.jpg
    spiele.jpg
    37,3 KB · Aufrufe: 27
Also bevor wir hier noch 100 Vorschläge machen wie es lauten könnte und du dann immer sagt: "Ne noch nicht ganz...." wär es sicher effektiver wenn du nen paar create table und inserts mit testdaten bereitstellst :)
Dann nochmal genau schreiben wie das Ergebnis aussehen soll und dann kann ich mich da mal dran versuchen.

lg
 
hier die beiden exportierten tabellen im anhang :)

wie oben schon beschrieben, ist eine Mannschaft an einem Tag "heimteam(ID)" und am anderen "gastteam(ID)" diese ID's sind mit der Tabelle "teams" verknüpft.
Jede Mannschaft bekommt pro Spieltag plus und minus Punkte (heimpunkte - gastpunkte), plus und minus Sätze (spiele_heim - spiele_gast)
Nun sollte berechnet werden:


heimpunkte : gastpunke
differenz zwischen heimpunkte und gastpunkte
gespielte spiele
spiele_heim : spiele_gast (sind die gespielten sätze)
differenz zwischen spiele_heim und spiele_gast


sortierung wie im ersten Post beschrieben, wer die größte Differenz zwischen den heimpunkten und gastpunkten hat, wenn punktegleichheit wer weniger Gesamtspiele(Tuniere) gespielt hat und wenn hier nochmal gleichheit ist, dann nach der Differenz der Sätze.
 

Anhänge

Zurück