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