Ankündigung

Einklappen
Keine Ankündigung bisher.

Php Abfrage aus MySQL mit count() für eine Rangliste

Einklappen

Neue Werbung 2019

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Php Abfrage aus MySQL mit count() für eine Rangliste

    Hallo,

    ich habe eine MySQL Tabelle games mit folgender Struktur:

    Code:
    Gid (auto)
    Tid (number from other table tournament)
    Gaway (Player1)
    Ghome (Player2)
    Gwon (Player1)
    Der Inhalt der Tabelle games ist folgender:

    Code:
    Gid (1,2,3,4...)
    Tid (1,1,1,1...)
    Gaway (Player1, Player2, Player3, Player4...)
    Ghome (Player3, Player4, Player4, Player1...)
    Gwon (Player1, Player4, Player4, Player4...)
    Mit folgender Abfrage lasse ich mir eine Tabelle ausgeben :

    PHP-Code:
    <?php $stat $pdo->prepare("SELECT tid, ghome, gaway, gwon, COUNT(gwon) AS anzahl FROM games WHERE tid = '".$_GET[‚tid‘]."' AND gwon NOT LIKE 'draw' GROUP BY gwon ORDER BY anzahl DESC");
    $stat->execute();
    $i 1;
    While(
    $row $stat->fetch())
    {
    Echo 
    $i;
    $row['gwon'];
    $row['anzahl'];
    $i++;
    ?>
    PLATZ | NAME | PUNKTE
    1 | Player4 | 3
    2 | Player1 | 1

    Das Problem ist, dass er mir nicht alle Spieler ausgibt, sondern nur die mindestens 1 mal gewonnen haben. In meinem Beispiel fehlen Playe2 und Player3. Wie kann ich das ändern, dass die Tabelle wie folgt aussieht?

    PLATZ | NAME | PUNKTE
    1 | Player4 | 3
    2 | Player1 | 1
    3 | Player2 | 0
    3 | Player3 | 0

    Vielen lieben Dank für die Bemühungen im Voraus.

    P. S. Ja in dem Code ist gefährlich bzgl. SQL injections

  • #2
    In Abfragen mit Aggregationen (count(gwon) ist sowas) müssen alle Spalten im Resultat entweder aggregiert oder gruppiert werden. Das ist bei Dir nicht der Fall. *Richtige* Datenbanken würden Dein SQL als syntaktisch falsch mit einem Fehler ablehnen, MySQL liefert statt dessen ein falsches Ergebniss.

    Mein Ratschlag: wirf MySQL weg. Weit weg.


    PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services

    Kommentar


    • #3
      Die Spalte mit den Punkten mit Null vorbelegen, also dafault 0.
      Siehe auch https://dev.mysql.com/doc/refman/8.0...-defaults.html

      Du verwendest das Prepare Statement falsch, da fehlt die Bindung des Parameters und da du den in der Abfrage ohne zu maskieren eingefügt hast, ist das eine grosse Sicherheitslücke. Mehr dazu findest du auch in der Wissenssammlung.

      Bei Verwendung von Group By müssen alle Spalten gruppiert oder mit einer Aggregatfunktion versehen sein ansonsten sind deine Daten eher zufällig, andere DBMS werfen da einen Fehler, mysql standardmässig leider nicht .

      Kommentar


      • #4
        Vielen Dank für eure Antworten. Ich habe meine MySQL Tabelle nochmal geändert, da es so wie ich es verstanden habe nicht mit count() zuverlässig funktioniert.
        Meine Tabelle games sieht nun so aus:

        Code:
        Gid (auto)
        Tid (number from other table tournament)
        Gaway (Player1)
        Ghome (Player2)
        Gawaypunkte (Standard 0)
        Ghomepunkte (Standard 0)
        Der Wert bei Ghomepunkte und Gawaypunkte ist als Beispiel so:
        Player1 gewint Gawaypunkte 1 und Ghomepunkte 0
        Player2 gewinnt Gawaypunkte 0 und Ghomepunkte 1
        Bei unentschieden bei beiden 0

        PHP-Code:
        SELECT SUM(Gawaypunkte) AS total FROM games  UNION SELECT SUM(Ghomepunkte) AS total FROM Games GROUP BY Gaway 
        Das Problem ist das er dabei die Punkte zusammen rechnet aber richtig wären ja nur die Punkte zusammen zu zählen wo er auch gewonnen hat. Stehe im moment voll auf dem Schlauch. Vielleicht habt ihr ja eine Lösungscode?

        Kommentar


        • #5
          Erstens solltest du mal deine Spalten verständlich benennen.

          Was ist ein "gid"? Was ist ein "tid"? Was ist ein "gaway"? "ghomepunkte"? Bitte verwende ordentliche Wörter für deine Spalten und auch nur in einer Sprache und keine kryptischen Abkürzungen. Spaltennamen sollten keine Rätselaufgabe sein, sondern klar verständlich für jedermann, ohne dass er nachfragen muss.

          Desweiteren gehören Spieler in eine eigene Tabelle.

          Wenn du das alles behoben hast, poste bitte deine vollständige Tabellenstruktur inkl. Testdaten als SQL-Code.

          Kommentar


          • #6
            Zitat von Lalo Beitrag anzeigen
            PHP-Code:
            SELECT SUM(Gawaypunkte) AS total FROM games UNION SELECT SUM(Ghomepunkte) AS total FROM Games GROUP BY Gaway 
            Das Problem ist das er dabei die Punkte zusammen rechnet aber richtig wären ja nur die Punkte zusammen zu zählen wo er auch gewonnen hat. ..Vielleicht habt ihr ja eine Lösungscode?
            Ja, schön wär's! Für einen Lösungscode müsste die Anforderung verständlich sein! Hier gibt es zwar hellbringer, aber keine Hellseher.
            Und hellbringer hat vollkommen Recht. Schon die Tabelle, Konstruktion, Benennung und Semantik ist nicht verständlich.

            Das Statement, was Du darauf setzt, ergibt erst Recht keinen Sinn und man fragt sich, wie es zu dem passen soll, was Du als Lösung "umschreibst".

            Man könnte vermuten, dass GAWAY und GHOME Referenzen auf Spieler sein sollen.
            Eine Gruppierung nach Spalte GAWAY, wäre also eine Gruppierung der Ausgabe die je nach Referenzwert verschiedene Spieler betrifft, aber nicht ausgegeben wird, also ziemlich sinnlos ist. Das Statement produziert nur verschiedene Summen.
            Das macht es dann noch sinnloser für 2 Spalten in einem Union, die Du ohne jegliche Einschränkung auch gleich in einem Statement zusammenrechnen könntest.

            Also schau Dir mal an, was der Unterschied ist zwischen GROUP BY und WHERE.
            Und befolge den Rat von hellbringer.

            Vielleicht findest Du auch in Deinem Datenmodell eine bessere Möglichkeit des Ausdrucks dafür, ob Player Auswärtspunkte oder Heimpunkte erspielt hat.

            Nur mal so als Tipp: Wie baut man einen Einkaufszettel auf? Als Fließtext oder als Liste?

            Kommentar

            Lädt...
            X