MySQL Abfrage sortieren
kevinkirs38
- datenbank
- mysqli
- php
1 Matthias Apsel- mysqli
1 Julius0 kevinkirs380 Julius
0 Robert B.
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! 😀
Hallo kevinkirs38,
in SQL sortiert man mit ORDER BY
.
Bis demnächst
Matthias
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
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
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
Ja, ich verwende PHPmyAdmin
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
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
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.
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
Hello,
der Wertebereich im MySQL-Spaltentyp ist erheblich größer, als der vom UNIX-Timestamp.
Liebe Grüße
Tom S.
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
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. ↩︎
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
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
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