Mysql-Ausgabe mit PHP - Reihenfolge aus Datumsfeld

fawin2

Benutzer
Beiträge
8
Hallo zusammen,

ich habe mich gerade hier angemeldet, da ich eine Frage habe bei der ich allein nicht nicht weiterkomme und hoffe, dass ihr mir einen Tipp geben könnt.

Ich möchte mit php eine mysql-Tabelle ausgeben, das funktioniert auch soweit, allerdings benötige ich eine andere Reihenfolge.

Bisher nutze ich
Code:
 $sql = "SELECT * FROM tabelle_2 WHERE published = 1 ORDER BY F12";

Das Feld F12 enthält eine Datumsangabe im Format d.m.Y also z.B. 31.12.2022. Der Feldtyp ist "text". Beides kann ich leider nicht ändern, da die Tabelle extern befüllt wird.

Momentan ist die Tabelle wie folgt sortiert (Nur Spalte F12):

01.11.2022
02.08.2022
03.08.2022
05.01.2022
05.01.2023
06.03.2022


Ich würde aber gerne nach Datum aufsteigend sortieren, z.B. so:

05.01.2022
06.03.2022
02.08.2022
03.08.2022
01.11.2022
05.01.2023

Kann mir jemand sagen, wie ich die richtige Reihenfolge hinbekomme?

Code:
<?php

$sql = "SELECT * FROM tabelle_2 WHERE published = 1 ORDER BY F12" ;
if ($erg = $db->query($sql)) {
    while ($datensatz = $erg->fetch_object()) {
        $daten[] = $datensatz;
    }
}
?>
<div>
<table>
    <thead>
        <tr>
            <th class="name">Name</th>
            <th class="date">Datum</th>
            <th class="text">Text</th>

        </tr>
    </thead>
    <tbody>
<?php foreach ($daten as $inhalt) { ?>
        <tr>
            <td class="name"><?php echo $inhalt->F11; ?></td>
            <td class="date"><?php echo $inhalt->F12; ?></td>
            <td class="text"><?php echo $inhalt->F13; ?></td>
        </tr>
<?php } ?>
</tbody>
</table>

Vielen Dank und viele Grüße
Fawin
 
Werbung:
Das Feld F12 enthält eine Datumsangabe im Format d.m.Y also z.B. 31.12.2022. Der Feldtyp ist "text".
Das ist halt Bullshit. Punkt.

Falls MySQL nach dem Result einer Funktion sortieren kann (glaube nicht, daß es das kann), dann könnte das ein beschwerlicher Weg sein. Besser, du änderst das von Text nach DATE oder TIMESTAMP.

Ach ja: select * ist auch falsch, zumindest in produktivem Code.
 
Code:
postgres=# select * from bullshit ;
   datum    
------------
 05.01.2022
 06.03.2022
 02.08.2022
 03.08.2022
 01.11.2022
 05.01.2023
(6 rows)

postgres=# select * from bullshit order by datum;
   datum    
------------
 01.11.2022
 02.08.2022
 03.08.2022
 05.01.2022
 05.01.2023
 06.03.2022
(6 rows)

postgres=# select * from bullshit order by to_date(datum, 'dd.mm.yyyy');
   datum    
------------
 05.01.2022
 06.03.2022
 02.08.2022
 03.08.2022
 01.11.2022
 05.01.2023
(6 rows)

postgres=#
 
@akretschmer: Vielen Dank für deine Antwort!

Das die Datenbankkonfiguration bullshit ist, ist mir völlig klar. Ich kann es aber leider nicht ändern, da die Tabelle von einer externen Software erzeugt wird, auf die ich keinen Einfluss habe.

Das einzige was ich machen könnte ist ein eigenes Feld anlegen, was den String aus F12 kopiert, in das Format ymd umformt und dann in das neue Sortierfeld kopiert. Dann könnte ich die Tabelle über dieses Feld sortieren.

Aber ist das überhaupt möglich undwie müsste ein solches Script aussehen?


Vielen Dank nochmal bis hierher und viele Grüße
Fawin
 
einfach machbar, wenn man passende DB hat:

Code:
postgres=# alter table bullshit add column datum_date date generated always as (make_date(substring(datum,7,4)::int,substring(datum,4,2)::int,substring(datum,1,2)::int)) stored;
ALTER TABLE
postgres=# select * from bullshit ;
   datum    | datum_date 
------------+------------
 05.01.2022 | 2022-01-05
 06.03.2022 | 2022-03-06
 02.08.2022 | 2022-08-02
 03.08.2022 | 2022-08-03
 01.11.2022 | 2022-11-01
 05.01.2023 | 2023-01-05
(6 rows)

Ich füge also eine berechnete Spalte hinzu, die aus dem Text-Datum ein richtiges DATE berechnet. Wird vermutlich MySQL aber nicht können.
Die oben gezeigte Lösung gefällt Dir nicht, oder geht nicht?
 
@akretschmer: Sorry, das ich darauf nicht eingegangen bin. Mir gefällt was funktioniert... ☺️

Wenn ich wie im letzten Abschnitt von #3 beschreiben
PHP:
$sql = "SELECT * FROM tabelle_2 WHERE published = 1 order by to_date(F12, 'dd.mm.yyyy')";
nutze, gibt das Script eine leere Tabelle aus.

Ich erhalte auch eine leere Tabelle wenn ich versuche das Beispiel aus #5 in php zu nutzen

PHP:
$sql = "alter table tabelle_2 add column datum_date date generated always as (make_date(substring(F12,7,4)::int,substring(F12,4,2)::int,substring(F12,1,2)::int)) stored";

$sql = "select * FROM tabelle_2 WHERE published = 1 order by datum_date";

Es scheitert scheinbar an meiner Übersetzung in php.


Vielleicht hat ja noch jemand eine Idee.


Vielen Dank und viele Grüße
Fawin
 
ziehst du die $sql Variablen auch durch eine Schleife?

Code:
while ($row = pg_fetch_row($sql)) {
   -->TU DAS<--
}

weiß nicht, wies bei MySQL aussieht, nutze postgresql

EDIT:

Beispiel einer PHP-Seite, mit einem SQL-Befehl, und der Schleife:
Code:
<?php
    $conn = pg_connect("host=127.0.0.1 dbname=postgres user=postgres") or die("Fehler bei der Datenbankverbindung!");
   
    $sql = pg_query($conn, "select * from generate_series(1, 10)") or die("Fehler bei der Abfrage!");
   
    while($row = pg_fetch_row($sql)) {
        echo "<p>$row[0]</p>";
    }
?>

aber wie gesagt ist das PHP und PostgreSQL, musst es entsprechend übersetzen ;)

EDIT 2:

Für spezifische Fragen dazu, hier leider im falschem Forum ;D
 
Zuletzt bearbeitet:
Tipp zum Entwickeln: Mache das nicht gleich in Php. Führe die SQL Befehle direkt in der DB aus und wenn das Ergebnis stimmt, übernimm dies in Php.
 
Werbung:
Hallo zusammen,

vielen Dank für eure Antworten!

@Kampfgummibaerlie: Ja genau, ich mache eine Schleife per
PHP:
if ($erg = $db->query($sql)) {
    while ($datensatz = $erg->fetch_object()) {
        $daten[] = $datensatz;

@BerndB: Das funktioniert super. Tausend Dank dafür!

@Dukel: Da hast du Recht, das erleichtert die Fehlersuche, Danke für den Tipp!


Nochmal vielen Dank an alle dir geantwortet haben.

Viele Grüße
Fawin
 
Zurück
Oben