Ankündigung

Einklappen
Keine Ankündigung bisher.

[Erledigt] gleiche Abfrage zwei Verhalten

Einklappen

Neue Werbung 2019

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

  • [Erledigt] gleiche Abfrage zwei Verhalten

    Hallo,

    ich habe folgendes Problem und verstehe die Reaktion nicht. Ich habe eine SQl Abfrage die macht was sie soll:
    PHP-Code:
    $sql_gesamt=mysql_query("
    SELECT
    Name, Verein, Klasse , SUM(Punkte) AS Best8 FROM cupwertung
     WHERE Cup='1'
     AND
     (SELECT COUNT(*) FROM cupwertung AS t
     WHERE t.Name=cupwertung.Name AND t.Punkte >= cupwertung.Punkte) <=8
    GROUP BY  Name
    ORDER BY Best8 DESC

    "
    )  OR DIE (mysql_error()); 
    und dann die gleiche Abfrage andere Tabelle, und sie blendet den Platz 1 aus
    PHP-Code:
    $sql_gesamtmysql_query("
    SELECT  Team, Rennen , 
    SUM(Punkte) 
    AS Best8 FROM mannschaft

     WHERE
     (SELECT COUNT(*) FROM mannschaft AS t
     WHERE t.Team = mannschaft.Team
     AND
     t.Punkte = mannschaft.Punkte) <=8
     GROUP BY  Team
     ORDER BY Best8 DESC

     "
    )  OR DIE (mysql_error()); 
    Kann mir jemand sagen warum? Ich habe schon gegoogelt aber nicht wirklich eine Erklärung gefunden. Warum auch nur den ersten ausgeblendet?

  • #2
    Ein weiteres Phenomän ist bei beiden folgender. Sind es z.B.: 9 Werte der schlechteste Wert ist 9 aber bei zwei Datensätzen ist der Wert 9, werden beide abgezogen?

    Kommentar


    • #3
      http://sqlfiddle.com
      Meine Mysql-Skills reichen nicht um da unplugged was zu entdecken.

      Gutes Tool um Queries lesbarer zu formatieren: http://www.freeformatter.com/sql-formatter.html

      Da wir im PHP-Bereich sind noch:
      Standardtext für die Datenbankverbindung:
      Die mysql_* Erweiterung ist veraltet und wird in der nächsten PHP-Version entfernt.
      Durch einen Wechsel auf mysqli_* oder PDO greifst du auf die modernere API zu und hast die Möglichkeiten Prepared Statements zu benutzen die gegen Injections schützen.
      Ich persönlich bevorzuge PDO, schönes Tutorial: http://www.peterkropff.de/site/php/pdo.htm
      [COLOR=#A9A9A9]Relax, you're doing fine.[/COLOR]
      [URL="http://php.net/"]RTFM[/URL] | [URL="http://php-de.github.io/"]php.de Wissenssammlung[/URL] | [URL="http://use-the-index-luke.com/de"]Datenbankindizes[/URL] | [URL="https://www.php.de/forum/webentwicklung/datenbanken/111631-bild-aus-datenbank-auslesen?p=1209079#post1209079"]Dateien in der DB?[/URL]

      Kommentar


      • #4
        Ein weiteres Phenomän ist bei beiden folgender. Sind es z.B.: 9 Werte der schlechteste Wert ist 9 aber bei zwei Datensätzen ist der Wert 9, werden beide abgezogen?
        Bahnhof…

        Die Abfragen sind zudem nicht völlig gleich(artig). Einmal steht >=, einmal nur =.

        Ansonsten weigert sich mein Kopf, darüber nachzudenken, was das inhaltlich tun soll.

        Code:
        FROM cupwertung AS t
         WHERE t.Name=cupwertung.Name
        ?

        Kommentar


        • #5
          Zitat von Cyclestores Beitrag anzeigen
          Hallo,

          ich habe folgendes Problem und verstehe die Reaktion nicht. Ich habe eine SQl Abfrage die macht was sie soll:
          PHP-Code:
          $sql_gesamt=mysql_query("
          SELECT
          Name, Verein, Klasse , SUM(Punkte) AS Best8 FROM cupwertung
           WHERE Cup='1'
           AND
           (SELECT COUNT(*) FROM cupwertung AS t
           WHERE t.Name=cupwertung.Name AND t.Punkte >= cupwertung.Punkte) <=8
          GROUP BY  Name
          ORDER BY Best8 DESC

          "
          )  OR DIE (mysql_error()); 

          In zukünftigen Versionen von MySQL wirst Du dafür endlich das bekommen, was Du verdienst: einen Syntaxfehler. Ab MySQL 5.7.5 (wenn ich mich nicht grad vertue) wird MySQL so wie alle anderen Datenbanken der Welt endlich auch erkennen, daß bei solchen Abfragen alle Spalten des Resultates entweder aggregiert oder gruppiert sein müssen.

          Bis dahin darfst Dich gern noch wundern, warum es nicht funktioniert.
          PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services

          Kommentar


          • #6
            Erklärung was die Abfrage bewirken soll

            Die Abfrage soll aus einer Tabelle folgendes ermitteln.

            Sie ermittelt aus allen Datensätzen die jeweils besten 8 (best eines jeden Teilnehmers und bildet aus denen die Summe ihrer Punkte. So soll eine Rangliste ermittelt werden. Das macht sie auch nur eben wenn es z.B.
            10 Datensätze sind sollten ja nur 8 berücksichtigt werden. Nun macht sie aber bei 9 folgendes. 9 Ergebnisse die schlechtesten zwei davon mit 10 nun müßten ja nur 10 Punkte abgezogen werden nur sie zieht 20 ab warum?
            Bei der Variante Mannschaft kommt hinzu, das sie den Erstplatzierten ausblendet, der hat mehr als 10 Ergebnisse, andere auch aber die werden angezeigt.
            Weiteres Phenomän ist, sie bilden bei allen anderen nur die Gesamtsumme der Punkte egal wie weit man die benötigten best8 eingrenzt. Nur bei Mannschaft

            Kommentar


            • #7
              Zitat von akretschmer Beitrag anzeigen
              In zukünftigen Versionen von MySQL wirst Du dafür endlich das bekommen, was Du verdienst: einen Syntaxfehler. Ab MySQL 5.7.5 (wenn ich mich nicht grad vertue) wird MySQL so wie alle anderen Datenbanken der Welt endlich auch erkennen, daß bei solchen Abfragen alle Spalten des Resultates entweder aggregiert oder gruppiert sein müssen.

              Bis dahin darfst Dich gern noch wundern, warum es nicht funktioniert.
              Kam schon nur auf meinem neuen Rechner.

              Kommentar


              • #8
                Das weitaus am Meisten sinnvolle wäre, diese Fehler zu beheben anstelle wieder auf den alten Rechner zu wechseln.
                [URL="https://github.com/chrisandchris"]GitHub.com - ChrisAndChris[/URL] - [URL="https://github.com/chrisandchris/symfony-rowmapper"]RowMapper und QueryBuilder für MySQL-Datenbanken[/URL]

                Kommentar


                • #9
                  Zitat von Cyclestores Beitrag anzeigen
                  Die Abfrage soll aus einer Tabelle folgendes ermitteln.

                  Sie ermittelt aus allen Datensätzen die jeweils besten 8 (best eines jeden Teilnehmers und bildet aus denen die Summe ihrer Punkte. So soll eine Rangliste ermittelt werden.
                  Dazu nimmt man Window-Funktionen. Wird MySQL irgendwann sicherlich auch können.

                  Bis dahin halt warten oder sich mit PostgreSQL behelfen. Das kann das schon seit 5 Jahren oder so.
                  PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services

                  Kommentar


                  • #10
                    So das Problem habe ich gefunden. Es liegt nicht am query direkt. Das arbeitet richtig. ABer ein Mathematisches Problem ist es- Es soll ja nur die besten 8 berücksichtigen. Aber wenn nun die z.B. letzten 5 = gleiche Punktzahl, dann zieht es die 5 Werte ab. Wie ändere ich das query jetzt um zu erreichen das es nur zwei Werte abzieht? Oder sollte ich das am besten in PHP auslagern?

                    Kommentar


                    • #11
                      Ähm, das magst du sehen wie du willst, den Query, den du gepostet hast arbeitet nicht korrekt. Der ist Syntaktisch falsch. Das MySQL dir das verzeiht (und keinen Fehler ausgibt) ist eigentlich nur Schwachsinn.
                      [URL="https://github.com/chrisandchris"]GitHub.com - ChrisAndChris[/URL] - [URL="https://github.com/chrisandchris/symfony-rowmapper"]RowMapper und QueryBuilder für MySQL-Datenbanken[/URL]

                      Kommentar


                      • #12
                        So das Problem habe ich gefunden. Es liegt nicht am query direkt. Das arbeitet richtig. ABer ein Mathematisches Problem ist es- Es soll ja nur die besten 8 berücksichtigen. Aber wenn nun die z.B. letzten 5 = gleiche Punktzahl, dann zieht es die 5 Werte ab. Wie ändere ich das query jetzt um zu erreichen das es nur zwei Werte abzieht?
                        Bin ich eigentlich der Einzige, der die Erklärungen unverständlich findet?

                        Ansonsten habe ich dir letztes Jahr im Mai mal eine Query geschrieben, die die Durchschnittszeit der besten drei Fahrer eines Teams bildet.

                        Hier suchst du nun – vielleicht – die Summe der Punkte der besten acht Ergebnisse eines Fahrers.

                        - http://www.php.de/735090-post24.html

                        Kommentar

                        Lädt...
                        X