Löcher elegant stopfen: "1 3 4 7 11" => "1 2 3 4 5"
Löcher elegant stopfen: "1 3 4 7 11" => "1 2 3 4 5"
am 13.07.2006 08:56:20 von Bernd Muent
Hallo zusammen,
habe eine Tabelle derart:
name sort_order ID(auto_increment)
Katze 1
Maus 3
Hund 4
Elefant 7
Affe 11
Die "Löcher" in der Sortierreihenfolge sind halt durch Löschen etc.
entstanden.
Hätte jetzt gerne:
name sort_order ID(auto_increment)
Katze 1
Maus 2
Hund 3
Elefant 4
Affe 5
Sprich, eine fortlaufende Sortierreihenfolge, sozusagen alles aufrufen.
Natürlich kann ich alle Datensätze einlesen und zurückschreiben:
$result=mysql_query("SELECT ID FROM liste ORDER BY sort_order");
$sortCount=1;
while(list($ID)=mysql_fetch_row($result)) {
mysql_query("UPDATE liste SET sort_order=$sortCount WHERE ID=$ID");
$sortCount++;
}
Aber das halte ich nicht für besonders performant.
Danke für Tips für eine elegantere Lösung, Bernd
--
BM Computer-Services, Bergmannstr. 66, 10961 Berlin
Webdesign, Internet, Layout und Grafik
Tel.: 030/20649400, mobil 0175/7419517, Fax: 030/20649401
Web: http://www.bmservices.de, eMail: kontakt@bmservices.de
Re: Löcher elegant stopfen: "1 3 4 7 11" => "1 2 3 4 5"
am 13.07.2006 09:10:46 von Guy Walter
Bernd Muent schrieb:
> Hallo zusammen,
> habe eine Tabelle derart:
>
> name sort_order ID(auto_increment)
> Katze 1
> Maus 3
> Hund 4
> Elefant 7
> Affe 11
>
> Die "Löcher" in der Sortierreihenfolge sind halt durch Löschen etc.
> entstanden.
>
> Hätte jetzt gerne:
> name sort_order ID(auto_increment)
> Katze 1
> Maus 2
> Hund 3
> Elefant 4
> Affe 5
>
> Sprich, eine fortlaufende Sortierreihenfolge, sozusagen alles aufrufen.
>
> Natürlich kann ich alle Datensätze einlesen und zurückschreiben:
> $result=mysql_query("SELECT ID FROM liste ORDER BY sort_order");
>
> $sortCount=1;
> while(list($ID)=mysql_fetch_row($result)) {
> mysql_query("UPDATE liste SET sort_order=$sortCount WHERE ID=$ID");
> $sortCount++;
> }
>
> Aber das halte ich nicht für besonders performant.
>
> Danke für Tips für eine elegantere Lösung, Bernd
>
>
Hallo Bernd,
warum willst Du die Löcher stopfen? Wenn das nur zum Sortieren gebraucht
wird ist es doch egal ob da Löcher drin sind oder nicht. Sie Sortierung
ändert sich durch Löcher nicht.
Solltest Du dann die Reihenfolge von Katze und Maus tauschen wollen dann
tauscht Du einfach die sort_order der Beiden.
Gruss Guy
Re: Löcher elegant stopfen: "1 3 4 7 11" => "1 2 3 4 5"
am 13.07.2006 09:10:46 von Guy Walter
Bernd Muent schrieb:
> Hallo zusammen,
> habe eine Tabelle derart:
>
> name sort_order ID(auto_increment)
> Katze 1
> Maus 3
> Hund 4
> Elefant 7
> Affe 11
>
> Die "Löcher" in der Sortierreihenfolge sind halt durch Löschen etc.
> entstanden.
>
> Hätte jetzt gerne:
> name sort_order ID(auto_increment)
> Katze 1
> Maus 2
> Hund 3
> Elefant 4
> Affe 5
>
> Sprich, eine fortlaufende Sortierreihenfolge, sozusagen alles aufrufen.
>
> Natürlich kann ich alle Datensätze einlesen und zurückschreiben:
> $result=mysql_query("SELECT ID FROM liste ORDER BY sort_order");
>
> $sortCount=1;
> while(list($ID)=mysql_fetch_row($result)) {
> mysql_query("UPDATE liste SET sort_order=$sortCount WHERE ID=$ID");
> $sortCount++;
> }
>
> Aber das halte ich nicht für besonders performant.
>
> Danke für Tips für eine elegantere Lösung, Bernd
>
>
Hallo Bernd,
warum willst Du die Löcher stopfen? Wenn das nur zum Sortieren gebraucht
wird ist es doch egal ob da Löcher drin sind oder nicht. Sie Sortierung
ändert sich durch Löcher nicht.
Solltest Du dann die Reihenfolge von Katze und Maus tauschen wollen dann
tauscht Du einfach die sort_order der Beiden.
Gruss Guy
Re: Löcher elegant stopfen: "1 3 4 7 11" => "1 2 3 4 5"
am 13.07.2006 09:17:06 von Johannes Vogel
Hi Bernd
Bernd Muent wrote:
> Hallo zusammen,
> habe eine Tabelle derart:
> name sort_order ID(auto_increment)
> Die "Löcher" in der Sortierreihenfolge sind halt durch Löschen etc.
> entstanden.
> Hätte jetzt gerne:
> name sort_order ID(auto_increment)
> Sprich, eine fortlaufende Sortierreihenfolge, sozusagen alles aufrufen.
16.16. Meine IDs haben Lücken - wie vergebe ich sie neu?
http://www.php-faq.de/q/q-sql-ids.html
Nun gut, du hast nicht wirklich ein auto_increment, sondern eine
SortOrder-Problematik.
> Natürlich kann ich alle Datensätze einlesen und zurückschreiben:
> $result=mysql_query("SELECT ID FROM liste ORDER BY sort_order");
> $sortCount=1;
> while(list($ID)=mysql_fetch_row($result)) {
> mysql_query("UPDATE liste SET sort_order=$sortCount WHERE ID=$ID");
> $sortCount++;
> }
> Aber das halte ich nicht für besonders performant.
> Danke für Tips für eine elegantere Lösung, Bernd
Hier ist die Performance ja auch nicht so wichtig, da das ja nicht
dauernd auszuführen ist. Stimmts?
Du könntest alternativ 'alle späteren runterziehen'. Pseudocode:
do {
select sort_order from liste;
Lückenposition finden
Lückenlänge bestimmen
update liste set sort_order = sort_order - lückenlänge
where sort_order > lückenposition;
} while lücken bestehen
HTH, Johannes
Re: Löcher elegant stopfen: "1 3 4 7 11" => "1 2 3 4 5"
am 13.07.2006 09:17:06 von Johannes Vogel
Hi Bernd
Bernd Muent wrote:
> Hallo zusammen,
> habe eine Tabelle derart:
> name sort_order ID(auto_increment)
> Die "Löcher" in der Sortierreihenfolge sind halt durch Löschen etc.
> entstanden.
> Hätte jetzt gerne:
> name sort_order ID(auto_increment)
> Sprich, eine fortlaufende Sortierreihenfolge, sozusagen alles aufrufen.
16.16. Meine IDs haben Lücken - wie vergebe ich sie neu?
http://www.php-faq.de/q/q-sql-ids.html
Nun gut, du hast nicht wirklich ein auto_increment, sondern eine
SortOrder-Problematik.
> Natürlich kann ich alle Datensätze einlesen und zurückschreiben:
> $result=mysql_query("SELECT ID FROM liste ORDER BY sort_order");
> $sortCount=1;
> while(list($ID)=mysql_fetch_row($result)) {
> mysql_query("UPDATE liste SET sort_order=$sortCount WHERE ID=$ID");
> $sortCount++;
> }
> Aber das halte ich nicht für besonders performant.
> Danke für Tips für eine elegantere Lösung, Bernd
Hier ist die Performance ja auch nicht so wichtig, da das ja nicht
dauernd auszuführen ist. Stimmts?
Du könntest alternativ 'alle späteren runterziehen'. Pseudocode:
do {
select sort_order from liste;
Lückenposition finden
Lückenlänge bestimmen
update liste set sort_order = sort_order - lückenlänge
where sort_order > lückenposition;
} while lücken bestehen
HTH, Johannes
Re: Löcher elegant stopfen: "1 3 4 7 11" => "1 2 3 4 5"
am 13.07.2006 10:40:50 von Axel Schwenke
Bernd Muent wrote:
> habe eine Tabelle derart:
>
> name sort_order ID(auto_increment)
> Katze 1
> Maus 3
> Hund 4
> Elefant 7
> Affe 11
>
> Die "Löcher" in der Sortierreihenfolge sind halt durch Löschen etc.
> entstanden.
>
> Hätte jetzt gerne:
> name sort_order ID(auto_increment)
> Katze 1
> Maus 2
> Hund 3
> Elefant 4
> Affe 5
Warum? Ich könnte ja eher noch verstehen, daß man da Zehnerschritte
haben will (damit eine spätere Umsortierung genug Lücken findet).
Unaq ubpu: jre ung wrgmg abpu na ONFVP haq ERAHZORE trqnpug?
Eine vergleichsweise elegante Lösung ist, sort_order als FLOAT zu
deklarieren. Zwischen zwei FLOATS findet man fast immer eine Lücke.
> Natürlich kann ich alle Datensätze einlesen und zurückschreiben:
Mit hinreichend neuen MySQL-Versionen (die UPDATE ... ORDER BY
unterstützen) geht das auch in einem Schritt:
SET @x=0;
UPDATE SET sort_order=(@x:=@x+1) ORDER BY sort_order;
XL
Re: Löcher elegant stopfen: "1 3 4 7 11" => "1 2 3 4 5"
am 13.07.2006 10:40:50 von Axel Schwenke
Bernd Muent wrote:
> habe eine Tabelle derart:
>
> name sort_order ID(auto_increment)
> Katze 1
> Maus 3
> Hund 4
> Elefant 7
> Affe 11
>
> Die "Löcher" in der Sortierreihenfolge sind halt durch Löschen etc.
> entstanden.
>
> Hätte jetzt gerne:
> name sort_order ID(auto_increment)
> Katze 1
> Maus 2
> Hund 3
> Elefant 4
> Affe 5
Warum? Ich könnte ja eher noch verstehen, daß man da Zehnerschritte
haben will (damit eine spätere Umsortierung genug Lücken findet).
Unaq ubpu: jre ung wrgmg abpu na ONFVP haq ERAHZORE trqnpug?
Eine vergleichsweise elegante Lösung ist, sort_order als FLOAT zu
deklarieren. Zwischen zwei FLOATS findet man fast immer eine Lücke.
> Natürlich kann ich alle Datensätze einlesen und zurückschreiben:
Mit hinreichend neuen MySQL-Versionen (die UPDATE ... ORDER BY
unterstützen) geht das auch in einem Schritt:
SET @x=0;
UPDATE SET sort_order=(@x:=@x+1) ORDER BY sort_order;
XL
Re: Löcher elegant stopfen: "1 3 4 7 11" => "1 2 3 4 5"
am 13.07.2006 13:04:26 von Bernd Muent
Axel Schwenke schrieb:
> SET @x=0;
> UPDATE SET sort_order=(@x:=@x+1) ORDER BY sort_order;
Genau das hatte ich gesucht.
> Mit hinreichend neuen MySQL-Versionen (die UPDATE ... ORDER BY
> unterstützen) geht das auch in einem Schritt:
Was heißt hinreichend neu?
Ich finde auf der MySQL-Doku Seite nur:
http://dev.mysql.com/doc/refman/4.1/en/update.html
Manual für 3.23,4.0,4.1. Heißt das, das es mit jeder Version ab 3.23 geht?
Gruß, Bernd
--
BM Computer-Services, Bergmannstr. 66, 10961 Berlin
Webdesign, Internet, Layout und Grafik
Tel.: 030/20649400, mobil 0175/7419517, Fax: 030/20649401
Web: http://www.bmservices.de, eMail: kontakt@bmservices.de
Re: Löcher elegant stopfen: "1 3 4 7 11" => "1 2 3 4 5"
am 13.07.2006 13:04:26 von Bernd Muent
Axel Schwenke schrieb:
> SET @x=0;
> UPDATE SET sort_order=(@x:=@x+1) ORDER BY sort_order;
Genau das hatte ich gesucht.
> Mit hinreichend neuen MySQL-Versionen (die UPDATE ... ORDER BY
> unterstützen) geht das auch in einem Schritt:
Was heißt hinreichend neu?
Ich finde auf der MySQL-Doku Seite nur:
http://dev.mysql.com/doc/refman/4.1/en/update.html
Manual für 3.23,4.0,4.1. Heißt das, das es mit jeder Version ab 3.23 geht?
Gruß, Bernd
--
BM Computer-Services, Bergmannstr. 66, 10961 Berlin
Webdesign, Internet, Layout und Grafik
Tel.: 030/20649400, mobil 0175/7419517, Fax: 030/20649401
Web: http://www.bmservices.de, eMail: kontakt@bmservices.de
Re: Löcher elegant stopfen: "1 3 4 7 11" => "1 2 3 4 5"
am 13.07.2006 13:16:08 von Niels Braczek
Bernd Muent schrieb:
> Axel Schwenke schrieb:
>=20
> > Mit hinreichend neuen MySQL-Versionen (die UPDATE ... ORDER BY
> > unterstützen) geht das auch in einem Schritt:
>=20
> Was heißt hinreichend neu?
> Ich finde auf der MySQL-Doku Seite nur:
> http://dev.mysql.com/doc/refman/4.1/en/update.html
> Manual für 3.23,4.0,4.1. Heißt das, das es mit jeder Version ab 3.2=
3 geht?
Zitat von eben dieser Seite: "ORDER BY can be used from MySQL 4.0.0."
MfG
Niels
--=20
| http://www.kolleg.de =B7 Das Portal der Kollegs in Deutschland |
| http://www.bsds.de =B7 BSDS Braczek Software- und DatenSysteme |
| Webdesign =B7 Webhosting =B7 e-Commerce =B7 Joomla! Content Management =
|
------------------------------------------------------------ ------
Re: Löcher elegant stopfen: "1 3 4 7 11" => "1 2 3 4 5"
am 13.07.2006 13:16:08 von Niels Braczek
Bernd Muent schrieb:
> Axel Schwenke schrieb:
>=20
> > Mit hinreichend neuen MySQL-Versionen (die UPDATE ... ORDER BY
> > unterstützen) geht das auch in einem Schritt:
>=20
> Was heißt hinreichend neu?
> Ich finde auf der MySQL-Doku Seite nur:
> http://dev.mysql.com/doc/refman/4.1/en/update.html
> Manual für 3.23,4.0,4.1. Heißt das, das es mit jeder Version ab 3.2=
3 geht?
Zitat von eben dieser Seite: "ORDER BY can be used from MySQL 4.0.0."
MfG
Niels
--=20
| http://www.kolleg.de =B7 Das Portal der Kollegs in Deutschland |
| http://www.bsds.de =B7 BSDS Braczek Software- und DatenSysteme |
| Webdesign =B7 Webhosting =B7 e-Commerce =B7 Joomla! Content Management =
|
------------------------------------------------------------ ------
Re: Löcher elegant stopfen: "1 3 4 7 11" => "1 2 3 4 5"
am 13.07.2006 13:27:23 von Bernd Muent
Niels Braczek schrieb:
> Bernd Muent schrieb:
>> Was heißt hinreichend neu?
>> Ich finde auf der MySQL-Doku Seite nur:
>> http://dev.mysql.com/doc/refman/4.1/en/update.html
>> Manual für 3.23,4.0,4.1. Heißt das, das es mit jeder Version ab 3.23 geht?
> Zitat von eben dieser Seite: "ORDER BY can be used from MySQL 4.0.0."
Sorry, überlesen.
Vielen Dank, Bernd
--
BM Computer-Services, Bergmannstr. 66, 10961 Berlin
Webdesign, Internet, Layout und Grafik
Tel.: 030/20649400, mobil 0175/7419517, Fax: 030/20649401
Web: http://www.bmservices.de, eMail: kontakt@bmservices.de
Re: Löcher elegant stopfen: "1 3 4 7 11" => "1 2 3 4 5"
am 13.07.2006 13:27:23 von Bernd Muent
Niels Braczek schrieb:
> Bernd Muent schrieb:
>> Was heißt hinreichend neu?
>> Ich finde auf der MySQL-Doku Seite nur:
>> http://dev.mysql.com/doc/refman/4.1/en/update.html
>> Manual für 3.23,4.0,4.1. Heißt das, das es mit jeder Version ab 3.23 geht?
> Zitat von eben dieser Seite: "ORDER BY can be used from MySQL 4.0.0."
Sorry, überlesen.
Vielen Dank, Bernd
--
BM Computer-Services, Bergmannstr. 66, 10961 Berlin
Webdesign, Internet, Layout und Grafik
Tel.: 030/20649400, mobil 0175/7419517, Fax: 030/20649401
Web: http://www.bmservices.de, eMail: kontakt@bmservices.de
Re: Löcherelegant stopfen: "1 3 4 7 11"
am 13.07.2006 18:47:29 von Matthias Esken
On Thu, 13 Jul 2006 10:40:50 +0200, Axel Schwenke wrote:
> Unaq ubpu: jre ung wrgmg abpu na ONFVP haq ERAHZORE trqnpug?
*meld*
Gruß,
Matthias