set reihenfolge=reihenfolge-1 where id=$idrauf;
unlock table...
Statt lockings könntest du natürlich auch Transactions verwenden.
HTH; Johannes
Re: Reihenfolge von Datensätzen festlegen
am 01.10.2006 13:58:09 von Axel Schwenke
Martin Schneider wrote:
> Dazu habe ich Feld "INT reihenfolge" eingeführt, bei der Ausgabe wird
> dann nach "ORDER BY reihenfolge" sortiert. Neue Datensätze werden beim
> Einfügen einfach hinten angestellt (MAX(reihenfolge)+1).
>
> Ich habe also nun die Aufgabe, per SQL bei 2 Datensätzen den Wert des
> Feldes reihenfolge zu vertauschen.
>
> 1.) Ist dieser Ansatz so in Ordnung?
Der clevere Ansatz wäre, das Reihenfolge-Feld nicht lückenlos zu
befüllen, sondern in z.B. Zehnerschritten. Wenn du einen Datensatz
verschieben willst, legst du ihn in die Mitte zwischen seine neuen
Vorgänger/Nachfolger. Immer dann, wenn das nicht geht (zwischen den
neuen "Nachbarn" ist kein Platz mehr) macht du ein "RENUMBER" und
machst alle Lücken wieder zu 10. BASIC läßt grüßen.
Im Normalfall mußt du dann genau einen Datensatz ändern. Und auch
das Renumbering geht atomar (UPDATE ... ORDER BY).
Eine interessante Alternative wäre, `reihenfolge` als FLOAT zu
definieren. Zwischen zwei FLOATs paßt fast immer noch ein weiteres.
Du mußt so seltener neu numerieren.
> 2.) Wie kann ich die Vertauschung innerhalb eines SQL-Statements
> hinbekommen (MySql 4.1)?
Die beiden Datesätze mögen die IDs 4711 und 0815 haben. Die Sortier-
spalte habe die Werte 42 und 43:
ALTER TABLE ... SET reihenfolge=85-reihenfolge WHERE id IN (4711, 0815)
XL
Re: Reihenfolge von Datensätzenfestlegen
am 01.10.2006 14:05:05 von Hertha Steck
Mathias Fiedler wrote:
> Am Sun, 01 Oct 2006 11:00:36 +0200 schrieb Martin Schneider:
>
>> Nun muß der Benutzer die Reihenfolge verändern können. Dazu werden alle
>> Datensätze dargestellt, und man kann mittels "hoch" und "runter"-Tasten
>> an jedem Eintrag einen Eintrag eins nach oben bzw. unten verschieben.
>>
Und wenn der nächste Benutzer die Reihenfolge wieder anders haben will, wird
zurückgetauscht? Und die Datenbanktabelle enthält im Feld "reihenfolge"
jeweils die Präferenz des letzten Benutzers? Wäre es nicht besser, eine
solche Änderung nur in der Oberfläche durchzuführen und nicht auf die
Datenbank durchschlagen zu lassen?
>> Ich habe also nun die Aufgabe, per SQL bei 2 Datensätzen den Wert des
>> Feldes reihenfolge zu vertauschen.
>>
>> 1.) Ist dieser Ansatz so in Ordnung?
>> 2.) Wie kann ich die Vertauschung innerhalb eines SQL-Statements
>> hinbekommen (MySql 4.1)?
>>
>> Grüße
>>
>> Martin
>
> Soweit ich weis, kann man nicht zwei Zeilen auf einmal ändern. Man muß
> schon die Zeilen nacheinander ändern. Wie regelst Du die Anzeige und das
> hoch und runter verschieben? Mit einem Web Interface?
>
Zwei oder mehr Zeilen auf einmal ändern ist kein prinzipielles Problem -
"UPDATE meinetabelle SET reihenfolge = reihenfolge - 5 WHERE reihenfolge >
10" geht ja auch. Aber für das Vertauschen gibt's wohl keine passende
Formel für die SET-Klausel. Wenn Du für Dein reihenfolge-Feld springende
Nummern verwendest und die Nummerierung in der ganzen Tabelle oft genug
aktualisierst (Abstände wiederherstellen), könntest Du mit der Änderung
eines Satzes auskommen.
Re: Reihenfolge von Datensätzen festlegen
am 01.10.2006 14:09:28 von Axel Schwenke
Mathias Fiedler wrote:
>
> Soweit ich weis, kann man nicht zwei Zeilen auf einmal ändern. Man muß
> schon die Zeilen nacheinander ändern.
Bullshit! Siehe Message-ID:
Mathias,
es ist ja noch halbwegs lustig, dir dabei zuzusehen, wie du deine
eigenen Probleme mangels Wissen/Erfahrung nicht gelöst bekommst.
Der Spaß hört auf, wenn du anderen Leuten falsche Tips gibst.
Ich möchze dich also *sehr* darum bitten, dich mit Hinweisen
zurück zu halten.
XL
Re: Reihenfolge von Datensätzen festlegen
am 01.10.2006 14:50:59 von Kai Ruhnau
Axel Schwenke wrote:
> Martin Schneider wrote:
>
>> Dazu habe ich Feld "INT reihenfolge" eingeführt, bei der Ausgabe wird
>> dann nach "ORDER BY reihenfolge" sortiert. Neue Datensätze werden beim
>> Einfügen einfach hinten angestellt (MAX(reihenfolge)+1).
>>
>> Ich habe also nun die Aufgabe, per SQL bei 2 Datensätzen den Wert des
>> Feldes reihenfolge zu vertauschen.
>>
>> 2.) Wie kann ich die Vertauschung innerhalb eines SQL-Statements
>> hinbekommen (MySql 4.1)?
>
> Die beiden Datesätze mögen die IDs 4711 und 0815 haben. Die Sortier-
> spalte habe die Werte 42 und 43:
>
> ALTER TABLE ... SET reihenfolge=85-reihenfolge WHERE id IN (4711, 0815)
Wie verhält es sich hier, wenn auf reihenfolge ein UNIQUE-Constraint liegt?
- Funktioniert das, wird das Update atomar ausgeführt?
- Funktioniert das nicht, so wie bei aufeinanderfolgenden UPDATEs?
Grüße
Kai
--
This signature is left as an exercise for the reader.
Re: Reihenfolge von Datensätzen festlegen
am 01.10.2006 15:53:55 von Axel Schwenke
Kai Ruhnau wrote:
> Axel Schwenke wrote:
>> Die beiden Datesätze mögen die IDs 4711 und 0815 haben. Die Sortier-
>> spalte habe die Werte 42 und 43:
>>
>> ALTER TABLE ... SET reihenfolge=85-reihenfolge WHERE id IN (4711, 0815)
>
> Wie verhält es sich hier, wenn auf reihenfolge ein UNIQUE-Constraint liegt?
Funktioniert nicht. Hier weicht MySQL wohl vom Standard ab, nach dem
Constraints erst am Ende einer Transaktion geprüft werden sollen.
Hatte ich vor einiger Zeit selber schon mal hier(?) geschrieben.
XL
Re: Reihenfolge von Datensätzen festlegen
am 03.10.2006 08:58:25 von jan.clauss
Martin Schneider schrieb:
> Hallo! Ich habe eine Tabelle mit Datensätzen, die in einer
> frei-festlegbaren Reihenfolge sortiert werden sollen.
>
> Dazu habe ich Feld "INT reihenfolge" eingeführt, bei der Ausgabe wird
> dann nach "ORDER BY reihenfolge" sortiert. Neue Datensätze werden beim
> Einfügen einfach hinten angestellt (MAX(reihenfolge)+1).
>
> Nun muß der Benutzer die Reihenfolge verändern können. Dazu werden alle
> Datensätze dargestellt, und man kann mittels "hoch" und "runter"-Tasten
> an jedem Eintrag einen Eintrag eins nach oben bzw. unten verschieben.
>
> Ich habe also nun die Aufgabe, per SQL bei 2 Datensätzen den Wert des
> Feldes reihenfolge zu vertauschen.
>
> 1.) Ist dieser Ansatz so in Ordnung?
> 2.) Wie kann ich die Vertauschung innerhalb eines SQL-Statements
> hinbekommen (MySql 4.1)?
Nur mal eben aus einem älteren Tread entnommen...
> Thomas Rachel schrieb:
> >>
> >> Angenommen, Du willst 5 und 7 vertauschen:
> >>
> >> UPDATE tabelle SET sortid=12-sortid WHERE sortid IN (5,7)
>
>
Re: Reihenfolge von Datensätzen festlegen
am 05.10.2006 16:46:39 von jan.clauss
Axel Schwenke schrieb:
> Kai Ruhnau wrote:
>> Axel Schwenke wrote:
>
>>> Die beiden Datesätze mögen die IDs 4711 und 0815 haben. Die Sortier-
>>> spalte habe die Werte 42 und 43:
>>>
>>> ALTER TABLE ... SET reihenfolge=85-reihenfolge WHERE id IN (4711, 0815)
>> Wie verhält es sich hier, wenn auf reihenfolge ein UNIQUE-Constraint liegt?
>
> Funktioniert nicht. Hier weicht MySQL wohl vom Standard ab, nach dem
> Constraints erst am Ende einer Transaktion geprüft werden sollen.
>
> Hatte ich vor einiger Zeit selber schon mal hier(?) geschrieben.
>
Rein aus dem Gedächtnis:
Könnte es besser mit ALTER TABLE ... SET reihenfolge:=85-reihenfolge
WHERE id IN (4711, 0815)
funktionieren?
Re: Reihenfolge von Datensätzenfestlegen
am 05.10.2006 22:14:09 von Hertha Steck
Jan Clauß wrote:
> Axel Schwenke schrieb:
> Rein aus dem Gedächtnis:
>
> Könnte es besser mit ALTER TABLE ... SET reihenfolge:=85-reihenfolge
> WHERE id IN (4711, 0815)
>
> funktionieren?
Wieso denn eigentlich "ALTER TABLE ..." und nicht "UPDATE"? Dann aber auf
jeden Falle ohne ":=".
Re: Reihenfolge von Datensätzenfestlegen
am 06.10.2006 00:19:35 von Axel Schwenke
Hertha Steck wrote:
> Jan Clauß wrote:
>>
>> Könnte es besser mit ALTER TABLE ... SET reihenfolge:=85-reihenfolge
>> WHERE id IN (4711, 0815)
>>
>> funktionieren?
>
> Wieso denn eigentlich "ALTER TABLE ..." und nicht "UPDATE"?
Ei freilich. Da kannst du mal sehen, wie betriebsblind man wird :-)
> Dann aber auf jeden Falle ohne ":=".
Ja. Und prinzipiell funktioniert das auch. Nur eben nicht, wenn auf dem
`reihenfolge` Feld ein UNIQUE Constraint liegt. Ein solches wäre aber
wünschenswert, damit die Reihenfolge auch wirklich eindeutig ist.
XL
Re: Reihenfolge von Datensätzenfestlegen
am 06.10.2006 00:38:20 von Christian Hammers
On 2006-10-06 Axel Schwenke wrote:
> Hertha Steck wrote:
> > Jan Clauß wrote:
> >>
> >> Könnte es besser mit ALTER TABLE ... SET reihenfolge:=3D85-reihenfol=
ge
> >> WHERE id IN (4711, 0815)
....
> Ja. Und prinzipiell funktioniert das auch. Nur eben nicht, wenn auf dem
> `reihenfolge` Feld ein UNIQUE Constraint liegt. Ein solches wäre aber
> wünschenswert, damit die Reihenfolge auch wirklich eindeutig ist.
Ach, wenn die blöden Dinger stören, einfach abschalten:
/*!40014 SET UNIQUE_CHECKS=3D0 */;
UPDATE ... SET reihenfolge =3D 85-reihenfolge WHERE id IN (4711,0815);
/*!40014 SET UNIQUE_CHECKS=3D1 */;
http://dev.mysql.com/doc/refman/5.0/en/set-option.html
tschüss,
-christian-