Reihenfolge der Datensätze aus MySQL?

2nd

2nd

Aktives Mitglied
Thread Starter
Dabei seit
25.07.2004
Beiträge
9.018
Reaktionspunkte
243
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
 
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
 
SELECT Feld1, Feld2, usw. from OBJECT

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
 
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
 
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
 
Wow, danke. Genau sowas hab ich gesucht :)

Frank
 
Waaaahhh

2ndreality schrieb:
Jo, das Query ist schon weiter vorne und zwar:

PHP:
SELECT * from TABLE

"..."

Frank

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!
 
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!
 
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
 
noch eins....

... wenn jetzt noch ein Benutzer via PHP abgefragt werden kann, dann fehlt nur noch ein Feld "geaendert_von". Dann hast Du die totale Kontrolle.

Gruß
Sven
 
Ihr seid super. Funktioniert jetzt erstmal per:

PHP:
$query = "SELECT * FROM ".$tm."_".$mm."_".$lm." ORDER BY DATUM DESC";

Das mit dem SELECT * kommt natürlich aus den Tutorials. Aber ich habe vorgestern als absoluter PHP- und Programmierdilletant das erste Mal eine MySQL Datenbank angelegt und bin froh, dass ich einigermassen kapiere, wie ich Daten rein (phpMyAdmin) und wieder rausbekomme (SELECT).

Wenn man sich das Ergebnis anschaut, ist das Datumsformat ja UNIX Stil, wie krieg ich das ins deutsche Format? Ich check den Code von Hilarios nicht ganz per DATE_FORMAT.

Den Timestamp hab ich schon reingebaut, funktioniert auch und intern reicht ja zum nachsehen (per phpMyAdmin). Das SELECT muss ich noch umbauen:

Alle Felder also einzeln ansprechen?

PHP:
SELECT datum FROM ".$tm."_".$mm."_".$lm." ORDER BY DATUM DESC

Das .$tm."_".$mm."_".$lm. ist mein Tabellenname!

Frank
 
2ndreality schrieb:
Ihr seid super. Funktioniert jetzt erstmal per:

PHP:
$query = "SELECT * FROM ".$tm."_".$mm."_".$lm." ORDER BY DATUM DESC";

Das mit dem SELECT * kommt natürlich aus den Tutorials. Aber ich habe vorgestern als absoluter PHP- und Programmierdilletant das erste Mal eine MySQL Datenbank angelegt und bin froh, dass ich einigermassen kapiere, wie ich Daten rein (phpMyAdmin) und wieder rausbekomme (SELECT).

Wenn man sich das Ergebnis anschaut, ist das Datumsformat ja UNIX Stil, wie krieg ich das ins deutsche Format? Ich check den Code von Hilarios nicht ganz per DATE_FORMAT.

Den Timestamp hab ich schon reingebaut, funktioniert auch und intern reicht ja zum nachsehen (per phpMyAdmin). Das SELECT muss ich noch umbauen:

Alle Felder also einzeln ansprechen?

PHP:
SELECT datum FROM ".$tm."_".$mm."_".$lm." ORDER BY DATUM DESC

Das .$tm."_".$mm."_".$lm. ist mein Tabellenname!

Frank

Njain, das Datumsformat ist schon unterschiedlich zum Unix-Timestamp auch wenn es auf den ersten Blick so aussieht.

Die fachlich beste Erklärung findest Du beim Hersteller mit vieeelen Beispielen.
 
Felder einzeln...

Jawohl:

SELECT datum, Feld2, Feld3, uds FROM ........


Gruß
Sven

PS: Ich formatiere gerne, wenn's geht!

SELECT Feld1
, Feld2
, Feld3
FROM Tabelle
 
So, habs hingekommen. Komische Funktion! Ist der Query jetzt ok?

PHP:
SELECT DATE_FORMAT(datum, '%d. %m. %Y') datum,headline,newstext,autor FROM ".$tm."_".$mm."_".$lm." ORDER BY DATUM DESC";

Das erste Argument in DATE_FORMAT ist der betreffende Spaltenname mit dem Datum der Tabelle?

Ist das jetzt richtig so mit den Feldern, die einzeln aufgeführt sind und kein * mehr?

Frank
 
So sei es

Genau so! Wenn ich irgendwie helfen konnte, dann freu ich mich.



Gruß
Sven
 
Doch, super :)

Vielen Dank an alle!!!!

Vorerst ;)

Brauch bestimmt nochmal Hilfe...

F.
 
thovan schrieb:
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".

Wenn man eh alle Spalten braucht, ist nichts 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!!).

Ich halte es für ziemlich exotisch über die Spalten eines Tupels zu iterieren.

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.

Man iteriert nicht über die Spalten und greift auch nicht über einen numerischen Index auf die Spalten zu, sondern über die Spaltennamen. No Problem.
 
Hilarious schrieb:
PHP:
$sql .= (!empty ($datum)) ? sprintf ("datum='%s', ", $datum) : "datum = NOW(), ";

Besser mysql_real_escape_string() verwenden.
 
Zurück
Oben Unten