Dirk: MySQL: Reihenfolge in einer Datenbank manuell verändern

Hallo zusammen,

irgendwie stehe ich vor einer unlösbaren AUfgabe oder sehe einfach den Wald vor lauter Bäumen nicht. Mein Problem: Ich muß in einer MySQL Datenbank die Reihenfolge der Zeilen jederzeit festlegen und ändern können. Gibt es da irgendeine Möglichkeit, die funktioniert?

(Nein, ich bin nicht zu faul zum Programmieren, sondern verzweifelt. Ich habe seit Stunden programmiert und immer wieder einen Ansatz adaptiert - leider erfolglos: Man nehme den Zeitstempel des Vorgänders / Nachfolgers und mache den betreffende Datensatz kleiner oder größer. Dabei stößt man aber ganz schnell an seine Grenzen, da dadurch sehr schnell Zeilen dieselben Werte haben und dann eine Anordnung reine Willkür ist. Mir ist es leider nicht gelungen, diese Konstellationen zu bezwingen. Gibt es überhaupt eine Möglichkeit?)

Bin für jeden Schnipsel dankbar!
viele Grüße, Dirk.

  1. Tach auch Dirk,

    Hallo zusammen,

    irgendwie stehe ich vor einer unlösbaren AUfgabe oder sehe einfach den Wald vor lauter Bäumen nicht. Mein Problem: Ich muß in einer MySQL Datenbank die Reihenfolge der Zeilen jederzeit festlegen und ändern können. Gibt es da irgendeine Möglichkeit, die funktioniert?

    Grundsätzlich schreibt die Datenbank die Datensätze immer so in die Tabellen, "wie sie meint", d. h. du hast da keinen Einfluß darauf... Allerdings kannst Du die Ausgabe über Sortierkriterien steuern,

    ORDER BY

    ist dein Freund dabei.

    Man nehme den Zeitstempel des Vorgänders / Nachfolgers

    ist eine Möglichkeit dabei, eine genauere Aufgabenstellung würde beim Helfen helfen...

    http://www.gruss-aus-essen.de

    Maik

  2. yo,

    irgendwie stehe ich vor einer unlösbaren AUfgabe oder sehe einfach den Wald vor lauter Bäumen nicht.

    sinds die augen, geh zu runke. spass beseite....

    die frage ist, was mit reihenfolge gemeint ist. eine tabelle ist für sich erst einmal eine unsortierte menge und bleibt es auch. es macht also gar keinen sinn, die datensätze innerhalb der tabelle sortieren zu wolllen.

    was sinn macht, ist die ausgabe der datensätze in eine gewünschte ordnung zu bringen. und diese kann man jederzeit festlegen und ändern und zwar über den ORDER BY befehl. eine vorraussetzung dafür ist, dass die tabelle geeignete spalten besitzt, die eben durch die ORDER BY klausel angesprochen werden. und das ist genau die funktion, die du suchst und die man auch benutzen sollte, sprich erst gar nicht versuchen die datensätze innerhalb der tabelle zu sortieren.

    es wäre sinnvoll, wenn du deine unlösbare aufgabe noch mal genauer beschreiben könntest.

    Ilja

  3. Hello Dirk,

    Zeitstempel sind i.d.R. ungeeignet für eine saubere Sortierung, da ihre Granularität zu groß ist, bzw. wenn man sie zum Unique-Key erheben würde, keine Zeitstempel mehr wären.

    Wenn also dur gleichen Sekunde 10 Datensätze in die Tabelle eintreten, müsste man bei neun davon lügen. Es hilft dann also nur z.B. ein Autoincrement-Key, der aber bei MySQL angeblich nicht garantiert hochzählt.

    Wenn es nur um die Reihenfolge in der Ausgabe der Tabelle geht, dann muss der von Dir gesuchte Schlüssel auch kein Primary Key sein, obwohl er Unique sein sollte. Da dieser Schlüssel allerdings keine feste Haftung an die Daten hat, sondern mal dem einen Satz und mal dem anderen gehören kann (Man beachte die Ríchtung: Der Schlüssel gehört dem Satz, beim Primary ist es umgekehrt), hat er keinen Identifikationswert.

    Zur Praxis:

    Wenn nun ein Datensatz "hinten angefügt" werden soll:

    • Tabelle sperren
    • Größten Sortierschlüssel suchen
    • Datensatz mit Max+1 einfügen
    • Tabelle entsprerren

    Um einen Datensatz "vor einem Satz einzufügen":

    • Tabelle sperren
    • Sortierschlüssel des betroffenen Satzes auslesen
    • alle Sortierschlüssel Schlüssel >= diesem Schlüssel um eins erhöhen [1]
    • Datensatz mit Schlüssel einfügen
    • Tabelle entsprerren

    Beim Löschen entstehen ggf. Lücken. Darüber muss man sich aber be genügend großem Schlüsselvorrat keine Gedanken machen.

    Vertauschen von Sätzen:

    • Tabelle sperren
    • Schlüssel der beiden Sätze auslesen
    • Schlüssel vertauscht wieder zuweisen [2]
    • Tabelle entsperren

    [1] es muss darauf geachtet werden, wie die jeweilige SQL-Datenbankmaschine Ergebnismengen erzeugt.
        Wenn nämlich die Ergebnismenge dynamisch erzeugt wird, während die Veränderung stattfindet,
        kann es zu Problemen kommen, da das zu verändernde Datenfeld auch Bestandteil des Firlters ist.

    [2] Wenn man sinnvollerweise eine Unique-Key auf die Schlüsselspalte gelegt hat,
        benötigt man hierfür ggf. mehrere Statements. Man muss einem der beiden Sätze
        temporär einen "neutralen Schlüssel" zuweisen, da ja doppelte nicht erlaubt sind.

    Harzliche Grüße vom Berg
    esst mehr http://www.harte-harzer.de

    Tom

    --
    Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
    Nur selber lernen macht schlau