Nummerieren der Datensätze

  • Hallo zusammen,

    ich habe ein kleines Problem. Um es einfacher zu machen nur die wichtigsten Spalten der Tabelle: Position (Int) und Text (Text).

    Man kann über eine Eingabemaske die Position und den Text frei eingeben.

    Jetzt mein Problem:
    Wenn man bei Position z.B. die Nummer 2 eingibt, möchte ich, dass diese nur einmal vorhanden sein sollte. Also das die Position der anderen Datensätze entsprechen um 1 erhöht werden, z.B.
    Datensatz 1 -> Position 1
    Datensatz 2 -> Position 2
    Datensatz 3 -> Position 3

    Wenn jetzt bei Datensatz 4 -> Position 2 eingegeben wird sollte es dann so aussehen:
    Datensatz 1 -> Position 1
    Datensatz 4 -> Position 2
    Datensatz 2 -> Position 3
    Datensatz 3 -> Position 4

    Ich denke schon eine geraume Zeit über das Problem nach und habe auch schon die große Suchmaschine befragt, aber irgendwie nicht ein passende Lösung gefunden.

    Für eine Tipp wäre ich echt dankbar.

    Gruß Uwe

  • Du legst eine neue Spalte an z.B. "order_id" und sortierst die Datensätze danach.
    Wenn du einen neuen Datensatz anlegst holste dir einfach den höchsten Wert aus order_id mit MAX(`order_id`)
    und beim ändern der Position tauscht du die Werte aus.

    EDIT:
    wenn du dafür schon eine Spalte hast, dann kannst du die natürlich auch nehmen

    Gruß crAzywuLf :D

  • Jetzt mein Problem:
    Wenn man bei Position z.B. die Nummer 2 eingibt, möchte ich, dass diese nur einmal vorhanden sein sollte. Also das die Position der anderen Datensätze entsprechen um 1 erhöht werden

    Das beschreibt doch sehr schön die ID mit einem Auto_Increment.

  • Nicht wirklich, er will einfach, dass die Position nur einmal vorkommt und er will sie austauschen können. Dafür ist eine Positionsspalte angebracht, eine unique/auto_increment Spalte eignet sich hierfür nicht - man tauscht keine ID's. Er sollte eine seperate ID Spalte haben.

    2 Mal editiert, zuletzt von phore (19. Mai 2009 um 09:53)

  • Hallo,

    in der Tabelle gibt es ein Feld AutoID mit Auto_Increment, die ich natürlich nicht ändern möchte. Vielleicht zur Erklärung, ich möchte mit dem Feld Position die Sortierung der Ausgabe erreichen. Also wenn der Anwender der Meinung ist, dass der Inhalt von Datensatz 15 mit der Position Nummer 15 nicht mehr an 15. Stelle auftauchen soll, sondern an Stelle 3. Stelle sollten die Datensätze mit der Position 3 bis 14 entsprechend um 1 weiter nummeriert werden.

    Ich hoffe ich habe mich halbwegs verständlich ausgedrückt.
    (Ein Schwabe kann alles außer Hochdeutsch, und in meinem Fall kommt dieses Problem noch dazu ;)

    Gruß Uwe

  • dann is schon die lösung von wulf die beste. neues db-feld einfügen und
    dort dann die jeweilige position eintragen. über ne sql-abfrage musst dann
    halt rausfinden welche datensätze größer als die eingabe sind und die dann
    um 1 hochzählen.

    des id feld is ungeeignet da es a) automatisch und b) fortlaufend befüllt wird.

  • Ich verstehe den Sinn der ganzen Konstruktion nicht wirklich, aber okay. Auf dein erstes Beispiel bezogen
    Du machst ein
    UPDATE tabelle SET order_id=order_id+1 WHERE order_id >= 2
    Das verschiebt alle Datensätze von 2 bis zum Ende der Tabelle quasi um eins nach hinten. Dann setzt du Datensatz 4 mit der order_id 2 ein.
    Hoffe, ich habe die Frage richtig verstanden.

    Information will frei verfügbar sein.

    Don't eat unpeeled hedgehogs.

  • Am einfachsten sind Positions-Sortierungen wenn du auf das ganze neu-"berechnen" verzichtest und einfach einen direkten Tausch machst, also die Position von einem Element mit der eines anderen Elements austauschst (die Lösung von Crazywulf).

  • Am einfachsten sind Positions-Sortierungen wenn du auf das ganze neu-"berechnen" verzichtest und einfach einen direkten Tausch machst, also die Position von einem Element mit der eines anderen Elements austauschst (die Lösung von Crazywulf).

    jipp

    PHP
    <?php
    $oid_eins = 5;
    $oid_zwei = 3;
    mysql_query("UPDATE `tabelle` SET `order_id` = '$oid_zwei' WHERE `order_id` = '$oid_eins'");
    mysql_query("UPDATE `tabelle` SET `order_id` = '$oid_eins' WHERE `oder_id` = '$oid_zwei'");
    ?>

    oder:

    Gruß crAzywuLf :D

    Einmal editiert, zuletzt von crAzywuLf (19. Mai 2009 um 10:45)

  • Hallo,

    danke für die schnellen und hilfreichen Anregungen. Ich habe das jetzt so gelöst:

    $sql = "UPDATE $tabelle SET Position = Position + 1 WHERE Position >= $Position";

    wobei $Position aus meinem Formular übergeben wird (gewünschte Position).

    Einziger Schönheitsfehler ist, dass keine fehlenden Nummern erkannt werden und es entsprechend aufgefüllt wird, aber damit kann ich leben, da die Tabelle vielleicht max. 30 Datensätze enthält die nur sehr selten und auch nur bei Bedarf aktualisiert werden.

    Danach kommt das INSERT INTO bzw. UPDATE eines vorhandenen Datensatzes.

    Danke und Gruß
    Uwe