MYSQL Tabelle Nummern neu vergeben

Thomas_Jung

Erfahrenes Mitglied
HI, ich habe eine Tabelle mit drei Felder id, produkt und order_by_id.
Wenn ein Datensatz hinzu kommt erhält er die nächst höhere Nummer (order_by_id+1)
Wenn ich nun einen Datensatz lösche, entstehen Lücken aus 1 2 3 4 5 6 wird dann 2 3 4 5 6
Nun möchte ich die Datensätze neu anordnen -> aus 2 3 4 5 6 wird 1 2 3 4 5
Wichtig ist, dass die vorhandene Sortierfolge nicht verändert wird.
Beispiel
order_by_id 2 war dem Produkt Apfel zugeordnet sollte jetzt 1 werden

u.s.w

Code:
Datensätze vorher nach order_by_id sortieren
SELECT order_by_id FROM `test` ORDER BY order_by_id ASC;

Das Feld order_by_id leeren
UPDATE `test` set `order_by_id`= ''; 

Nun müste ich den 1 Datensatz im Feld order_by_id eine 1 verpassen und dann folgenden Befehl ausführen
Wie könnte ich das machen?


Dann Numern neu vergeben
UPDATE `test` set `order_by_id`=`order_by_id`+1;

Gruß Thomas
 

Yaslaw

alter Rempler
Moderator
Schön ist es nicht.
Und es macht auch keinen Sinn, eine Order-by ID zu haben, die gleich sortiert ist wie die id
SQL:
update my_table t, (
  select t.id, @rownum:=@rownum+1 as new_order_id
  from my_table t, (select @rownum := 0) as vars
  order by t.id
) oid
set t.order_by_id = oid.new_order_id
where t.id = oid.id[/sql]
 
Zuletzt bearbeitet:

bdt600

Mitglied
Sollte auch einfacher gehen:
SET @a = 0; UPDATE tabelle SET order_by_id = (@a := @a +1);

Sorry, da muss ja eine bestehende Sortierung beibehalten werden.
Trotzdem wäre es interessant zu wissen, wieso eine laufende Nummer erforderlich ist.
 

Thomas_Jung

Erfahrenes Mitglied
Wer sag den das order_by_id die gleiche ist wie id.
Die id AUTO_INCREMENT hat gar nichts mit der order_by_id zu tun.
Der Hintergrund ist, dass ich eine Abfrage auf die Tabelle habe, die mir immer die nächste höhere Nummer (order_by_id) ausgibt.
Wenn aktuell die 2 Aktiv ist und er sich den nächsten Datensatz holen will, also die 3
gibt es eine Fehlermeldung, weil der Datensatz gelöscht wurde, :(
Deshalb die neue Anordnung.
 

Thomas_Jung

Erfahrenes Mitglied
Es scheint mir, du hast die Frage bzw. Aufgabe nicht verstanden.

Folgende Lösung ist mir eingefallen. Eigentlich ganz einfach.

Ich denke, wenn ich einen Datensatz aus der Tabelle lösche und ich anschließend folgendes Skript ausführe
sollte das Problem gelöst sein.

PHP:
<?php
$x = 0;
$sql = "SELECT id, order_by_id FROM `test` ORDER BY order_by_id ASC";
$result = mysqli_query($connection, $sql);
while($row = mysqli_fetch_array($result)) { $x++;
$id = $row['id'];

        $sql_update =  "UPDATE `test` SET order_by_id = $x  WHERE id = $id ";
        $result_update = mysqli_query($connection, $sql_update);

}
?>