Reihenfolge der Datensätze aus MySQL?

Diskutiere mit über: Reihenfolge der Datensätze aus MySQL? im Datenbanksysteme für das Web Forum

  1. 2nd

    2nd Thread Starter MacUser Mitglied

    Beiträge:
    8.902
    Zustimmungen:
    242
    Registriert seit:
    25.07.2004
    Hi,

    folgendes Problem:

    Ich habe eine MySQL Datenbank mit einer Tabelle, in denen die aktuellen News der Firma reingeschrieben werden. Schreibe ich den ersten Datensatz, dann den 2. Datensatz, dann den 3. Datensatz usw. wird per Query der "älteste" Datensatz, also der, der als erstes in die Datenbank eingepflegt wurde, rausgeholt und angezeigt.

    http://www.2ndreality.net/prototype/vidis <- unter Menupunkt Firma

    Was ist jetzt das effizenteste, um die Datensätze genau andersrum aus der Tabelle der SQL DB auszulesen oder anzuzeigen, da ich ja die aktuellen/später eingepflegten News oben haben möchte?

    Ausgelesen wird übrigens über eine WHILE - Schleife:

    PHP:
    while($spalte mysql_fetch_object($result))
        {
        echo 
    $spalte->datum;
        echo 
    $spalte->newstext;
        }
    Danke,

    Frank
     
  2. marvin

    marvin MacUser Mitglied

    Beiträge:
    52
    Zustimmungen:
    0
    Registriert seit:
    09.12.2003
    order by

    Hallo,

    irgendwo muss ein SQL (SELECT Feld1, Feld2, usw. from OBJECT) generiert werden. Da gehört halt ein ORDER BY DATUM DESC rein. Wenn das nicht geht, dann könnte man eine View über die Tabelle legen. In der View baust Du dann den ORDER BY ein. Dann bekommst Du die Datensätze in der richtigen Reihenfolge.

    Gruß
    Sven
     
  3. 2nd

    2nd Thread Starter MacUser Mitglied

    Beiträge:
    8.902
    Zustimmungen:
    242
    Registriert seit:
    25.07.2004
    Jo, das Query ist schon weiter vorne und zwar:

    PHP:
    SELECT from TABLE
    Kann ich darauf den Order date Befehl anwenden? Meine Datumsangabe in der Datenbank liegt als VARCHAR vor, dh ich habe 3 Felder in der Tabelle:

    datum -> varchar 50
    headline -> varchar 50
    newstext -> text

    Liest SELECT dann mit ORDER BY DATE das Datum der Eingabe aus oder meinst Du, dass das Datum als Datum vorliegen muss?

    Frank
     
  4. marvin

    marvin MacUser Mitglied

    Beiträge:
    52
    Zustimmungen:
    0
    Registriert seit:
    09.12.2003
    Order By

    Hallo,

    das Ganze müsste ja dann so aussehen:

    SELECT * from TABLE order by datum desc

    (das "desc" steht für für "absteigend" - ich bin mir nicht sicher, ob es bei mysql auch genau so heisst). Ob das mit dem varchar Feld funktioniert, kann ich bei mysql nicht sagen.

    Ich betreue beruflich Datenbanken, aber keine mysql. Bitte seh' mich jetzt nicht als rechthaberisch (schreibt man das so???), aber der Datentyp varchar ist hier einfach nicht angebracht. So können ja auch nicht Datumswerte gespeichert werden. Wenn möglich, dann sollte die Datenbank für die Konsistenz (Richtigkeit) der Daten sorgen, wo es nur geht. Wenn also irgendwie möglich, verwende einen DATE Datentyp. Dann klappt auch der ORDER BY sicher.

    Gruß
    Sven
     
  5. 2nd

    2nd Thread Starter MacUser Mitglied

    Beiträge:
    8.902
    Zustimmungen:
    242
    Registriert seit:
    25.07.2004
    Jo Sven, hab gerade schon nachgeschaut, ob DATE geht - geht natürlich :) Und dann wird es uch funktionieren. Ich fang grad an und bin verwirrt wegen der vielen verschiedenen Datentypen. Die Sachen wie BLOB oder LONGINT kenn ich gar nicht mehr aus meinen Programmierzeiten von irgendwann mal :)

    Gibt es irgendwo eine gute Erklärung, wann man welchen Datentyp nimmt?

    Frank
     
  6. marvin

    marvin MacUser Mitglied

    Beiträge:
    52
    Zustimmungen:
    0
    Registriert seit:
    09.12.2003
  7. 2nd

    2nd Thread Starter MacUser Mitglied

    Beiträge:
    8.902
    Zustimmungen:
    242
    Registriert seit:
    25.07.2004
    Wow, danke. Genau sowas hab ich gesucht :)

    Frank
     
  8. thovan

    thovan MacUser Mitglied

    Beiträge:
    343
    Zustimmungen:
    0
    Registriert seit:
    03.11.2004
    Waaaahhh

    Ich gebe zu, dass ist jetzt OffTopi, aber Benutze NIE SELECT * !!!

    Und zwar aus zwei Gründen:
    1. Ist es aus Performance-Gründen schlechter die unbenötigten Spalten später mit der Programmiersprache aus dem ResultSet "herauszufiltern".
    2. Stell Dir vor, Du hast jetzt die Spalten "Spalte 1", "Spalte 2", "Spalte 3", "Spalte 4" und arbeitest die Datensätze des Resultsets mit einer Schleife ab (also alle Spalten jedes Datensatzes werden durch die Schleife abgearbeitet!!).
    Später fügst Du noch die Spalten "Spalte A" und "Spalte B" zu der Tabelle hinzu, am "besten" (schlechtesten) zwischen die bereits bestehenden Spalten.
    Wenn D u jetzt mit Select * arbeitetest, musst Du alle Deine alten Scripte wieder bearbeiten, damit diese wieder richtig laufen.
    Im ungünstigsten Fall merkst Du das auch dann erst, wenn Dich Dein Chef oder einer eurer Kunden anspricht und im schlimmsten fall zeigt eine öffentliche Ausgabe auf eurer Homepage vertrauliche Datenbank-Ausgaben an.

    Zugegeben ist das vielleicht ein Horror-Szenario, aber es macht schon Sinn mit Datenbanken sauber zu arbeiten.

    Schau mal hier - da wird das nochmal sehr gut erklärt!
     
  9. Hilarious

    Hilarious MacUser Mitglied

    Beiträge:
    2.195
    Zustimmungen:
    5
    Registriert seit:
    25.11.2004
    marvin hat völlig recht (ohne -haberisch zu sein ;) ). In MySQL gibt es noch eine sehr praktische Besonderheit. Man kann ein Feld der Tabelle hinzufügen, welches automatisch einen Zeitstempel der letzten Änderung am jeweiligen Datensatz speichert. Es lohnt sich für spätere Recherchen besonders, dieses Feld zusätzlich einzuführen.

    In Deinem Fall würde dies so aussehen:

    Code:
    | datum | headline | newstext |
    
    wird erweitert zu
    
    | datum | headline | newstext | letzteaenderung |
    
    Mit MySQL wäre das Feld "letzteaenderung" ein Feld vom Typ "TIMESTAMP". Wenn Du einen Datensatz schreibst per "INSERT" oder änderst per "UPDATE" (oder "REPLACE") lässt Du dieses Feld einfach leer. MySQL fügt anschließend einen Zeitstempel als Zahlenkette in dieses Feld ein. Ein Einfügen könnte demnach so aussehen:

    PHP:
    <?
    // Die Werte sind in den Variablen $datum, $headline und $newstext schon drin.

    $sql "INSERT INTO newstabelle SET ";
    $sql .= (!empty ($datum)) ? sprintf ("datum='%s', "$datum) : "datum = NOW(), ";
    $sql .= (!empty ($headline)) ? sprintf ("headline='%s', "mysql_real_escape_strintg ($headline)) : "headline = NULL, ";
    $sql .= (!empty ($text)) ? sprintf ("text='%s'"mysql_real_escape_string ($text)) : "text = NULL";

    if (
    $res mysql_query ($sql$connectionID)) {
       echo 
    "<pre>Bingo. Der Rotz ist drin.</pre>\n";
    } else {
       echo 
    "<pre>Pursche! Das war nix.</pre>\n";
    }

    ?>
    Wie Du darin siehst, wird auf die Angabe der zusätzlichen Spalte "letzteaenderung" verzichtet. Diese wird automatisch zum Zeitpunkt des INSERTs gefüllt. Du kannst dieses Feld natürlich trotzdem mit SELECT auslesen. Hier empfiehlt sich die Verwendung der Funktion "DATE_FORMAT", also zum Beispiel:

    Code:
    SELECT *, DATE_FORMAT(letzteaenderung,'%e.%c.%Y %k.%i.%s') AS letzteaenderung_formatiert FROM newstabelle WHERE letzteaenderung > '2005-01-01' ORDER BY letzteaenderung ASC
    
    Das Ergebnis könnte sein:
    Code:
    | datum | headline | newstext | letzteaenderung |
    
    | 2005-02-28 | Letzte Tag im Februar | Blablablabla... | 1.3.2005 8.34.28 |
    
    Das habe ich natürlich jetzt nicht im Einzelnen getestet, aber so (oder ziemlich so) sollte es funktionieren.

    Viel Erfolg!
     
  10. marvin

    marvin MacUser Mitglied

    Beiträge:
    52
    Zustimmungen:
    0
    Registriert seit:
    09.12.2003
    Select *

    Er hat einfach nur recht! Finde ich echt klasse.

    Die andere Möglichkeit ist eben eine VIEW. Die View ist einfach eine Sicht auf die Tabelle und beinhaltet einen SELECT auf die Tabelle (nur mit den gewünschten Feldern). Wenn Du dort die Feldnamen angibst, dann kann sich die Tabelle "darunter" auch erweitern. Ein weiterer Vorteil ist, dass man damit in Millisekunden switchen kann.

    Bsp.: Du hast ein 24/7 Online System. Eine Tabelle ist riesig und dauert Minuten um sie mit aktuellen Daten zu laden. Dann kannst Du das bequem im Hintergrund in eine zweite Tabelle tun und nach erfolgreichem Laden einfach die VIEW auf die zweite Tabelle setzen. Das merkt keiner.

    Gruß
    Sven
     
Die Seite wird geladen...
Ähnliche Themen - Reihenfolge Datensätze aus Forum Datum
SQL: Join auf Basis eines Start- und Endwerts aus der gejointen Tabelle Datenbanksysteme für das Web 02.09.2016
SQL: Nächstgelegenes Datum aus einer Gruppe ermitteln Datenbanksysteme für das Web 09.10.2014
Zugriff auf MySQL (Mac OSX) von Windows aus Datenbanksysteme für das Web 27.12.2011
SQL - Join - Nicht übereinstimmende Datensätze anzeigen Datenbanksysteme für das Web 02.02.2011
Datensätze mit einer bestimmten ID ausgeben. Datenbanksysteme für das Web 24.08.2006

Diese Seite empfehlen

Benutzerdefinierte Suche