kevinkirs38: MySQL Abfrage sortieren

Hallo zusammen,

ich habe ein Problem bei einer MySQL-Abfrage.

Ich habe unter phpMyAdmin eine Tabelle nach der Spalte "datum" sortiert. Doch wenn ich die Tabelle mit Hilfe von PHP auslese, ist diese Ausgabe nicht sortiert.

Meine Frage ist nun, wie kann ich die Ausgabe nach "datum" sortieren. (Die Spalte hat die Formatierung "date".)

Die Tabelle sieht folgendermaßen aus:

id	datum				ereignis


1		25.07.2017	Testtermin

3		25.07.2017 	Termin

2		28.07.2017 	Neuer

Der Abfrage-Code sieht so aus:

<?php

//Tagesdatum festlegen 

$timestamp = time(); 

//$datum = date("md", $timestamp);

$d1 = date("Y-m-d");

$d8 = date("Y-m-d", strtotime("+7 days"));

$ausgabe = array();

require_once ('./konfiguration.php');

$db_link = mysqli_connect (MYSQL_HOST,MYSQL_BENUTZER,MYSQL_KENNWORT,MYSQL_DATENBANK);

$select = "SELECT * FROM `kalender` WHERE datum BETWEEN '$d1' AND '$d8'";

$erg_select = mysqli_query($db_link, $select);

while ($day = mysqli_fetch_array( $erg_select, MYSQL_ASSOC))

{

	$var = $day['datum']; 

	$neu = explode("-",$var);

	$date = $neu[2].".".$neu[1].".".$neu[0];

	echo $date . ": ";

	echo $day[ereignis];

	echo "<br>";

}

Ausgabe:

25.07.2017	Testtermin

28.07.2017 	Neuer

25.07.2017 	Termin

Wie kann die Ausgabe nun nach dem Datum sortiert werden? Derzeit wird die Ausgabe scheinbar nach der ID formatiert.

Danke für die Hilfe! 😀

akzeptierte Antworten

  1. Hallo kevinkirs38,

    in SQL sortiert man mit ORDER BY.

    Bis demnächst
    Matthias

    --
    Rosen sind rot.
  2. Hallo kevinkirs38,

    Wie kann die Ausgabe nun nach dem Datum sortiert werden?

    das Stichwort ist ORDER BY mit Angabe der betreffenden Spalte. Es kann sein, dass du die Datumsspalte erst als passenden Datentyp (z.B. DATE) auszeichnen musst, damit auch „richtig“ sortiert wird (wenn deine Daten als Strings behandelt werden, würde ja bei aufsteigender Sortierung der 10.08.2017 vor dem 30.07.2017 liegen).

    Gruß
    Julius

    1. Hallo Julius,

      vielen Dank für deine Antwort!

      Leider kenne ich mich nicht sehr gut mit MySQL aus.

      Wie kann ich den Datentyp auszeichnen, damit korrekt sortiert wird?

      Gruß

      Kevin

      1. Hallo Kevin,

        Wie kann ich den Datentyp auszeichnen, damit korrekt sortiert wird?

        Am einfachsten kannst du das mit einer grafischen Lösung machen. Wahrscheinlich hast du Zugriff auf PHPmyAdmin oder ein ähnliches Werkzeug, liege ich da richtig?

        Gruß
        Julius

        1. Ja, ich verwende PHPmyAdmin

          1. Hallo Kevin,

            Ja, ich verwende PHPmyAdmin

            Dann müsstest du die betroffene Tabelle auswählen und dann auf den Reiter „Struktur“ klicken. Dort kannst du dann die Datentypen der einzelnen Tabellenspalten sehen. Dort müsstest du dann ggf. die betreffende Spalte zum bearbeiten auswählen und dort als Typ DATE einstellen. Du musst dann das Datum im Format YYYY-MM-DD also z. B. 2017-12-31 ablegen. Mit den in MySQL eingebauten Datumsfunktionen kannst du dir dann in den Queries auch die Ausgabe passend formatieren, also beispielsweise das hierzulande übliche Format DD.MM.YYYY ausgeben.

            Gruß
            Julius

            1. Hallo Julius,

              nur mal so am Rande... (hatte ja schon mal erwähnt, dass ich in Bezug auf mysql etwas eingerostet bin und nutze daher wieder die Gelegenheit, das etwas aufzufrischen)

              Ich weiß noch ziemlich genau, dass ich früher zu Anfang, für Zeitangaben, auch die SQL-vordefinierten Möglichkeiten genutzt habe, dann aber sehr schnell erkannte, dass es für mich wesentlich effektiver und einfacher zu handhaben ist, wenn ich stattdessen UNIX-Timestamp eintrage oder ein eigenes Format (JahrMonatTagStdSek). Dummerweise, weiß ich leider nicht mehr warum. Wäre es in jedem Fall besser die SQL-Vordefinierung zu nutzen?

              Gruss
              Henry

              1. Tach!

                Ich weiß noch ziemlich genau, dass ich früher zu Anfang, für Zeitangaben, auch die SQL-vordefinierten Möglichkeiten genutzt habe, dann aber sehr schnell erkannte, dass es für mich wesentlich effektiver und einfacher zu handhaben ist, wenn ich stattdessen UNIX-Timestamp eintrage oder ein eigenes Format (JahrMonatTagStdSek). Dummerweise, weiß ich leider nicht mehr warum.

                Vielleicht weil du dann nicht für Systeme, die mit Unix-Timestamps arbeiten (wie PHP) umformatieren musst. Andererseits kann man mittels zweier MySQL-Funktionen eine Umwandlung von und nach Unix-Timestamp veranlassen.

                Wäre es in jedem Fall besser die SQL-Vordefinierung zu nutzen?

                Wenn du lediglich Daten ablegst und nie in MySQL damit zu rechnen gedenkst, und dir die Anzeige in Programmen wie phpMyAdmin egal ist, oder du irgendeinen anderen Grund findest, kannst du das letzten Endes machen wie du willst.

                dedlfix.

                1. Hallo dedlfix,

                  Wenn du lediglich Daten ablegst und nie in MySQL damit zu rechnen gedenkst, und dir die Anzeige in Programmen wie phpMyAdmin egal ist, oder du irgendeinen anderen Grund findest, kannst du das letzten Endes machen wie du willst.

                  irgendeinen anderen Grund... 😉

                  Ja, so langsam komme ich wieder dahinter. Echt, ich kann jedem nur empfehlen sich ausreichend Dokus/Chronologie für seine eigenen Scripte zuzulegen oder zumindest EINEN Namen hier im Forum beizubehalten (finde ab und zu bis zu 15/16 Jahre alte Beiträge vom mir hier, die als Gesamtheit mein Gedächnis wieder auf Trab bringen würden).

                  Bei mir scheint der Grund gewesen zu sein, möglichst interne Formatierungen zu vermeiden, weil ich die meisten Scripte sowohl über Mysql als auch None-DB laufen lassen wollte. Klar geht das auch schön mit gekapselten Funktionen, aber gerade bei soclhen Formatierungen schien es mir besser. Wie gesagt, Erinnerung kommt nur laaaaangsaaam. ;-) Aber mit Datum als Zahlenwert zu rechnen war eigentlich nie das Problem, ging immer wunderbar. Nur, dass ich halt PHP zusätzlich dazu benötige...Insofern also Fazit: Wenn nichts gravierendes dagegen spricht, DATE/DATETIME bevorzugen für Datumsangaben, danke.

                  Gruss
                  Henry

              2. Hello,

                der Wertebereich im MySQL-Spaltentyp ist erheblich größer, als der vom UNIX-Timestamp.

                Liebe Grüße
                Tom S.

                --
                Es gibt nichts Gutes, außer man tut es
                Andersdenkende waren noch nie beliebt, aber meistens diejenigen, die die Freiheit vorangebracht haben.
              3. Hallo Henry,

                daraufhin, dass dir bereits Experten geantwortet haben, habe ich (My)SQL-Laie mich zurück gehalten 😀

                Aber eine kleine, vielleicht für dich interessante Ergänzung bringe ich dann doch noch an:
                In SQLite[1] gibt es gar keinen extra Datentyp für Daten (Plural von Datum), sondern man benutzt die Datentypen REAL, INTEGER und TEXT zur Speicherung solcher. Die Werte werden von den Datums- und Zeitfunktionen passend interpretiert.

                Gruß
                Julius



                1. Datenbank, die nicht nach dem Client-Server-Modell arbeitet und für die Integration in Software benutzt wird. Firefox nutzt SQLite beispielsweise zum Speichern von Lesezeichen. ↩︎

                1. Hallo Julius,

                  ...interessante Ergänzung bringe ich dann doch noch an:
                  In SQLite ...

                  Ja Sqlite habe ich wirklich mal geliebt (simple, handlich, effektiv). Weiß auch nicht ob Vers. 1 oder 2, aber spätestens ab Vers. 3 wurde diese schöne DB dann auch leider zu gewaltig und komplizierter und damit (für mich) nicht mehr wirklich sinnvoll. Schade eigentlich, denn der große Vorteil, die DB immer als Datei dabei zu haben, machte das schön kompakt. Woran es jetzt im Einzelnen gelegen haben mag, weiß ich nicht mehr, aber du motivierst mich gerade, das Thema noch mal anzugehen. 😉

                  Gruss
                  Henry

                  1. Hallo Henry,

                    Ja Sqlite habe ich wirklich mal geliebt (simple, handlich, effektiv).

                    Ich finde es vor allem praktisch, dass man beim Experimentieren immer nur die Datenbankdateien austauschen und sichern musste.

                    Vielleicht ist für dich auch noch Adminer interessant (falls du es noch nicht kennst)? – Ist so ähnlich wie phpMyAdmin, aber nur eine PHP-Datei und kann auch mit SQLite umgehen.

                    Woran es jetzt im Einzelnen gelegen haben mag, weiß ich nicht mehr, aber du motivierst mich gerade, das Thema noch mal anzugehen. 😉

                    Schön 😀.

                    Gruß
                    Julius

  3. Hallo Kevin,

    Ich habe unter phpMyAdmin eine Tabelle nach der Spalte "datum" sortiert. Doch wenn ich die Tabelle mit Hilfe von PHP auslese, ist diese Ausgabe nicht sortiert.

    Kleiner Tipp: In phpMyAdmin wird das SQL-Statement angezeigt, mit dem die Ausgabe erzeugt worden ist.

    Der Abfrage-Code sieht so aus:

    <?php
    
    // …
    
    $select = "SELECT * FROM `kalender` WHERE datum BETWEEN '$d1' AND '$d8'";
    
    $erg_select = mysqli_query($db_link, $select);
    

    Brauchst du denn „beliebig alle Felder“ – SELECT * oder weißt du schon vorab, welche Felder du benötigst? Ein SELECT datum,ereignis ist u.U. performanter. Und dann noch ein Hinweis zur Sicherheit: Durch manipulierte Variablen $d1 oder $d8 kannst du prinzipiell aus deinem SQL-Statement ausbrechen. Nimm lieber ein prepared statement.

    In deinem Schleifencode kannst du alle doppelten Anführungszeichen durch einfache Ersetzen, weil keine Variableninterpolation stattfindet. Und es muss natürlich $day['ereignis'] heißen.

    Viele Grüße
    Robert