Reihenfolge der Datensätze aus MySQL?

  1. 2nd

    2nd Thread StarterMacUser Mitglied

    Mitglied seit:
    25.07.2004
    Beiträge:
    8.901
    Zustimmungen:
    242
    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

    marvinMacUser Mitglied

    Mitglied seit:
    09.12.2003
    Beiträge:
    52
    Zustimmungen:
    0
    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
     
    marvin, 21.04.2005
  3. 2nd

    2nd Thread StarterMacUser Mitglied

    Mitglied seit:
    25.07.2004
    Beiträge:
    8.901
    Zustimmungen:
    242
    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

    marvinMacUser Mitglied

    Mitglied seit:
    09.12.2003
    Beiträge:
    52
    Zustimmungen:
    0
    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
     
    marvin, 21.04.2005
  5. 2nd

    2nd Thread StarterMacUser Mitglied

    Mitglied seit:
    25.07.2004
    Beiträge:
    8.901
    Zustimmungen:
    242
    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

    marvinMacUser Mitglied

    Mitglied seit:
    09.12.2003
    Beiträge:
    52
    Zustimmungen:
    0
    marvin, 21.04.2005
  7. 2nd

    2nd Thread StarterMacUser Mitglied

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

    Frank
     
  8. thovan

    thovanMacUser Mitglied

    Mitglied seit:
    03.11.2004
    Beiträge:
    343
    Zustimmungen:
    0
    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!
     
    thovan, 21.04.2005
  9. Hilarious

    HilariousMacUser Mitglied

    Mitglied seit:
    25.11.2004
    Beiträge:
    2.161
    Zustimmungen:
    5
    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!
     
    Hilarious, 21.04.2005
  10. marvin

    marvinMacUser Mitglied

    Mitglied seit:
    09.12.2003
    Beiträge:
    52
    Zustimmungen:
    0
    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
     
    marvin, 21.04.2005
Die Seite wird geladen...
Ähnliche Themen - Reihenfolge Datensätze aus
  1. maceis
    Antworten:
    8
    Aufrufe:
    3.016
  2. kebernerd
    Antworten:
    1
    Aufrufe:
    1.881
    QBFinest
    02.02.2011
  3. ThaHammer
    Antworten:
    13
    Aufrufe:
    854
  4. fabs
    Antworten:
    11
    Aufrufe:
    1.059
    ThaHammer
    25.08.2006
  5. Der_Jan
    Antworten:
    3
    Aufrufe:
    528
    master_p
    07.07.2005