Reihenfolge von Datensätzen festlegen

Reihenfolge von Datensätzen festlegen

am 01.10.2006 11:00:36 von Martin Schneider

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)?

Grüße

Martin

Re: Reihenfolge von Datensätzen festlegen

am 01.10.2006 11:24:43 von letters

Am Sun, 01 Oct 2006 11:00:36 +0200 schrieb Martin Schneider:

> 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)?
>
> 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?

mfg

Mathias

Re: Reihenfolge von Datensätzen festlegen

am 01.10.2006 11:43:52 von Martin Schneider

Hi Mathias,

danke für Deine Antwort!

>> 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?
Ja, genau. Wollte halt nicht nur deshalb auf InnoDB umsteigen. Ich bin
mir aber auch nicht ganz sicher, ob die Gefahr, dass 2 Leute
gleichzeitig die gleichen Daten anfassen wirklich so groß ist, und wenn
es wirklich mal passieren sollte wäre ja nur die Reihenfolge etwas
durcheinander.

Grüße

Martin

Re: Reihenfolge von Datensätzen festlegen

am 01.10.2006 11:52:54 von Johannes Vogel

Hi Martin

Martin Schneider wrote:
> 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)?

lock table...
select id from

where reihenfolge = $rauf; --> $idrauf
update
set reihenfolge=reihenfolge+1 where reihenfolge=$rauf-1;
update
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-