tutorials.de Buch-Aktion 05/2012
Seite 1 von 2 12 LetzteLetzte
ERLEDIGT
JA
ANTWORTEN
24
ZUGRIFFE
463
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    Avatar von Maniac
    Maniac Maniac ist offline Mitglied Smaragd
    Registriert seit
    Apr 2007
    Ort
    Augsburg/Gersthofen (Bayern)
    Beiträge
    1.204
    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 :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    
    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',
      ),
     

  2. #2
    Registriert seit
    Mar 2004
    Beiträge
    1.856
    Blog-Einträge
    2
    Unhöflich aber ich machs trotzdem...
    Gegenfrage: Kommen die Daten aus einer (my)SQL-Tabelle?
     
    Gebe keine Hilfe per PN, Mail, Instant Messenger etc.
    und keine Copy&Paste-Lösungen - ein bisschen selbst nachdenken sollte drin sein. Konstruktivismus 4tw!


    MfG, Zod

    __________________
    rpd Framework: Rapid Web-Engineering in PHP (Manual | Google Code)

  3. #3
    Avatar von Maniac
    Maniac Maniac ist offline Mitglied Smaragd
    Registriert seit
    Apr 2007
    Ort
    Augsburg/Gersthofen (Bayern)
    Beiträge
    1.204
    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.
    Angehängte Dateien Angehängte Dateien
     

  4. #4
    Registriert seit
    Mar 2004
    Beiträge
    1.856
    Blog-Einträge
    2
    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 :
    1
    
    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 :
    1
    
    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.
     
    Gebe keine Hilfe per PN, Mail, Instant Messenger etc.
    und keine Copy&Paste-Lösungen - ein bisschen selbst nachdenken sollte drin sein. Konstruktivismus 4tw!


    MfG, Zod

    __________________
    rpd Framework: Rapid Web-Engineering in PHP (Manual | Google Code)

  5. #5
    Avatar von Klein0r
    Klein0r Klein0r ist offline Mitglied Platin
    Registriert seit
    Sep 2007
    Ort
    Paderborn
    Beiträge
    718
    Zitat Zitat von Maniac_81 Beitrag anzeigen
    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
     

  6. #6
    Avatar von Maniac
    Maniac Maniac ist offline Mitglied Smaragd
    Registriert seit
    Apr 2007
    Ort
    Augsburg/Gersthofen (Bayern)
    Beiträge
    1.204
    das übersteigt meine sql-kenntnisse leider. ich bin mir nicht sicher ob ich einen subselect benötige.

    hier sind die 3 abfragen:

    PHP-Code:
    "SELECT * FROM `teams` WHERE liga_id=".intval($liga)." AND aktiv=".intval(1)
    resultierend aus dem 1. select das hier:

    PHP-Code:
    "SELECT * FROM `spiele` WHERE `heimteam`=".intval($teams['ID'])." OR `gastteam`=".intval($teams['ID'])
    und noch die anzahl der gespielten Tuniere:

    PHP-Code:
    "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-Code:
    "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)
     

  7. #7
    Registriert seit
    Mar 2004
    Beiträge
    1.856
    Blog-Einträge
    2
    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?
     
    Gebe keine Hilfe per PN, Mail, Instant Messenger etc.
    und keine Copy&Paste-Lösungen - ein bisschen selbst nachdenken sollte drin sein. Konstruktivismus 4tw!


    MfG, Zod

    __________________
    rpd Framework: Rapid Web-Engineering in PHP (Manual | Google Code)

  8. #8
    Avatar von Maniac
    Maniac Maniac ist offline Mitglied Smaragd
    Registriert seit
    Apr 2007
    Ort
    Augsburg/Gersthofen (Bayern)
    Beiträge
    1.204
    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"
    Miniaturansicht angehängter Grafiken Miniaturansicht angehängter Grafiken ligatabelle durch array sortieren-spiele.jpg  
     

  9. #9
    Avatar von Klein0r
    Klein0r Klein0r ist offline Mitglied Platin
    Registriert seit
    Sep 2007
    Ort
    Paderborn
    Beiträge
    718
    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
     

  10. #10
    Avatar von Maniac
    Maniac Maniac ist offline Mitglied Smaragd
    Registriert seit
    Apr 2007
    Ort
    Augsburg/Gersthofen (Bayern)
    Beiträge
    1.204
    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.
    Angehängte Dateien Angehängte Dateien
     

  11. #11
    Avatar von Klein0r
    Klein0r Klein0r ist offline Mitglied Platin
    Registriert seit
    Sep 2007
    Ort
    Paderborn
    Beiträge
    718
    So ich hoffe ich hab alles bedacht:
    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    
    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
    Miniaturansicht angehängter Grafiken Miniaturansicht angehängter Grafiken ligatabelle durch array sortieren-ligatabelle.jpg  
    Geändert von Klein0r (27.08.08 um 16:17 Uhr)
     

  12. #12
    Avatar von Maniac
    Maniac Maniac ist offline Mitglied Smaragd
    Registriert seit
    Apr 2007
    Ort
    Augsburg/Gersthofen (Bayern)
    Beiträge
    1.204
    jepp sieht schon sehr gut aus, nur wie bekomm ich nun noch 2 bedingungen in die WHERE abfrage? wenn ich es so mache:

    Code :
    1
    2
    3
    4
    5
    
    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.
    Geändert von Maniac (27.08.08 um 16:58 Uhr)
     

  13. #13
    Avatar von Klein0r
    Klein0r Klein0r ist offline Mitglied Platin
    Registriert seit
    Sep 2007
    Ort
    Paderborn
    Beiträge
    718
    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 :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    
    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
    Miniaturansicht angehängter Grafiken Miniaturansicht angehängter Grafiken ligatabelle durch array sortieren-ligatabelle2.jpg  
    Geändert von Klein0r (27.08.08 um 17:03 Uhr)
     

  14. #14
    Avatar von Klein0r
    Klein0r Klein0r ist offline Mitglied Platin
    Registriert seit
    Sep 2007
    Ort
    Paderborn
    Beiträge
    718
    Zitat Zitat von Maniac_81 Beitrag anzeigen
    jepp sieht schon sehr gut aus, nur wie bekomm ich nun noch 2 bedingungen in die WHERE abfrage? wenn ich es so mache:

    Code :
    1
    2
    3
    4
    5
    
    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 :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    
    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
    Miniaturansicht angehängter Grafiken Miniaturansicht angehängter Grafiken ligatabelle durch array sortieren-ligatabelle3.jpg  
     

  15. #15
    Avatar von Maniac
    Maniac Maniac ist offline Mitglied Smaragd
    Registriert seit
    Apr 2007
    Ort
    Augsburg/Gersthofen (Bayern)
    Beiträge
    1.204
    jetzt bin ich total verwirrt *gg*

    wenn ich nun folgendes abfrage:

    Code :
    1
    2
    3
    
    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 :
    1
    2
    3
    
    SELECT sum( heimpunkte ) AS heimplus, sum( gastpunkte ) as gastminus
    FROM `spiele` 
    WHERE heimteam = 2

    und:

    Code :
    1
    2
    3
    
    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
    Geändert von Maniac (27.08.08 um 17:44 Uhr)
     

Ähnliche Themen

  1. String-Array nach Int-Array sortieren
    Von Wolfy0013 im Forum Java
    Antworten: 5
    Letzter Beitrag: 06.05.10, 17:05
  2. Assoziatives Array (Zeilen Array) sortieren
    Von Gladiator6 im Forum PHP
    Antworten: 10
    Letzter Beitrag: 03.06.09, 00:36
  3. Antworten: 5
    Letzter Beitrag: 24.09.08, 00:10
  4. Array sortieren -> 2tes array angleichen
    Von ali-gator im Forum Flash Plattform
    Antworten: 2
    Letzter Beitrag: 27.10.06, 15:07
  5. Antworten: 1
    Letzter Beitrag: 08.01.03, 22:10