Tom: Menü-Reihenfolge ändern

Beitrag lesen

Hello,

da bnötigst Du eine atomar gebundene Bubblefunkiton... :-)

set @id = 4;
set @b_id = @id;

#nach oben rücken
    select a.id_zeit, lfd_nr into @a_id, @a_nr FROM zeit AS a where a.lfd_nr < (select @b_nr:= b.lfd_nr from zeit as b where b.id_zeit = @id) order by a.lfd_nr desc limit 1;
    select @a_id, @a_nr, @b_nr;

#nach unten rücken
    select a.id_zeit, lfd_nr into @a_id, @a_nr FROM zeit AS a where a.lfd_nr > (select @b_nr:= b.lfd_nr from zeit as b where b.id_zeit = @id) order by a.lfd_nr asc limit 1;
    select @a_id, @a_nr, @b_id, @b_nr;

Ich ahbe es nun nicht extra auf Deine Verhältnisse umgeschrieben, das musst Du bitte mal selber machen.

lfd_nr ist hier das Feld, das für die Sortierung verantwortlich ist.

Zugegriffen wird nicht über die laufende Nummer, sondern über die ID des Datensatzes, den man verschieben will. Diese Anfprderung sit aus der Praxis entstanden.

Du musst die beiden Benutzervariablen setzen und dann kannst Du das jeweilige Statement aufrufen.
Wesentliche Überlegung ist dabei, dass die Datenmanipulation in EINEM EINZIGEN Statement stattfinden muss, wenn Du die tabelle nicht sperren willst. Anderenfalls riskierst Du die Integrität der Daten.

Die Uservariablen sind verbindungs-autark, das bedeutet, dass Du Dir da keine Race-Condition einhandelst, wenn die in zwei Statements vorab gesetzt werden.

Wahrscheinlich kann man es auch noch optimieren, aber ich habe jetzt keine Lust dazu :-)

Mein MySQL ist down

Harzliche Grüße aus
Sankt Andreasberg
und Guten Rutsch

Tom

--
Nur selber lernen macht schlau