Mailinglisten-Archive |
Thomas Gericke schrieb am Freitag, den 16. Juli 1999: > [...] man möchte das Ganze nun aber reorganisieren, daß er die > Datensätze nochmal neu von 1 bis 501 durchnummeriert und dort dann > weiter macht. > > Wie geht das? Neben dem von Amalesh beschriebenen Ansatz ist die einfachste Lösung wahrscheinlich, die Umnumerierung in der Programmiersprache Deiner DB-Anwendung (sei's jetzt PHP, Perl, C++, ...) durchzuführen. Pseudocode: $old[] := SELECT aifeld FROM tabelle ORDER BY aifeld for $new:=1 to size($old[]) { UPDATE tabelle SET aifeld=$new WHERE aifeld=$old[$new] } Ich habe hier anschließend zwar noch eine nette SQL-Anfrage, die diese Umnumerierung unterstützt, aber direkt per Programmschleife geht's sicher doch am schnellsten! Beispieldaten: CREATE TABLE autoinc ( i int(11) DEFAULT '0' NOT NULL auto_increment, x char(10), KEY i (i) ); INSERT INTO autoinc VALUES (1,'0.8110') ,(4,'0.5139') ,(3,'0.1363') ,(20,'0.1399') ,(21,'errr') ,(2,'sdfs') ,(5,'abcd') ,(30,'0.0215'); Mein Gedanke ist, daß man eine fortlaufende Numerierung wieder durch einen Gruppierungstrick errechnen kann: SELECT SUM(a1.i>=a2.i) AS n, a1.i, a1.x FROM autoinc AS a1, autoinc AS a2 GROUP BY a1.i; ergibt: +---+----+--------+ | n | i | x | +---+----+--------+ | 1 | 1 | 0.8110 | | 2 | 2 | sdfs | | 3 | 3 | 0.1363 | | 4 | 4 | 0.5139 | | 5 | 5 | abcd | | 6 | 20 | 0.1399 | | 7 | 21 | errr | | 8 | 30 | 0.0215 | +---+----+--------+ Leider habe ich es nicht geschafft, dieses so errechnete n irgendwie für ein direktes UPDATE zu nutzen. Aber man kann das Ergebnis obiger Anfrage leicht für die nötigen UPDATES nutzen - wenn man will, sogar recht direkt. :-) SELECT CONCAT('UPDATE autoinc SET i=',SUM(a1.i>=a2.i) ,' WHERE i=',a1.i,';') AS Updates FROM autoinc AS a1, autoinc AS a2 GROUP BY a1.i; ergibt: +------------------------------------+ | Updates | +------------------------------------+ | UPDATE autoinc SET i=1 WHERE i=1; | | UPDATE autoinc SET i=2 WHERE i=2; | | UPDATE autoinc SET i=3 WHERE i=3; | | UPDATE autoinc SET i=4 WHERE i=4; | | UPDATE autoinc SET i=5 WHERE i=5; | | UPDATE autoinc SET i=6 WHERE i=20; | | UPDATE autoinc SET i=7 WHERE i=21; | | UPDATE autoinc SET i=8 WHERE i=30; | +------------------------------------+ Aber wie oben erwähnt, ist das wirklich mehr ein Gedankenspiel, was geht, denn ein sillvoller Vorschlag ... ;-) Ciao, Martin -- Martin Ramsch <m.ramsch_(at)_computer.org> <URL: http://home.pages.de/~ramsch/ > PGP KeyID=0xE8EF4F75 FiPr=52 44 5E F3 B0 B1 38 26 E4 EC 80 58 7B 31 3A D7 --- *** Abmelden von dieser Mailingliste funktioniert per E-Mail *** an mysql-de-request_(at)_lists.4t2.com mit Betreff/Subject: unsubscribe
php::bar PHP Wiki - Listenarchive