Index sortieren

huigc001

Benutzer
Beiträge
6
Hallo zusammen,

ich habe eine Tabelle cars und ich habe eine Tabelle cars_test (identischer Inhalt wie cars). Nun möchte ich in der Tabelle cars die IDs nach dem Datum(purchase_date) sortieren.

Ich habe etwas versucht aber das funktioniert nicht wie ich will. Könntet ihr mir bitte helfen?

Code:
SET @autoid := 0;
UPDATE cars as a
SET id = @autoid := (SELECT (@autoid+1)
          FROM cars_test AS b
          WHERE a.purchase_date = b.purchase_date AND a.chassis_number = b.chassis_number
          ORDER BY purchase_date ASC);
ALTER TABLE cars AUTO_INCREMENT=1;
 
Werbung:
Gern. Aber keiner hier weiß, was Du versucht hast und was passiert ist. Daher kann (vermutlich) auch keiner Dir helfen.
Hallo, ich versuche die IDs in der Tabelle cars neu zu indizieren. Also die IDs in der Tabelle cars sollen nach dem Datum sortiert von 1 bis n neu indiziert werden. Ist es genug oder brauchst du mehr Infos?
Vielen Dank für die schnelle Antwort
 
Hallo, ich versuche die IDs in der Tabelle cars neu zu indizieren. Also die IDs in der Tabelle cars sollen nach dem Datum sortiert von 1 bis n neu indiziert werden. Ist es genug oder brauchst du mehr Infos?
Vielen Dank für die schnelle Antwort

Beispiel:

cars:
Voher:
ID | chassis_number | date
1 | 55468 | 25.01.2015
2 | 78954 | 14.01.2008
3 | 12354 | 01.01.2006


Die Ergebnistabelle soll folgendermaßen aussehen:

ID | chassis_number | date
1 | 12354 | 01.01.2006
2 | 78954 | 14.01.2008
3 | 55468 | 25.01.2015

Im Ergebnis sind die Indizes neu ausgelegt unter der Bedingung, dass die Chassis_numbers nach dem Datum sortiert sind
 
Mir ist nicht klar, welches Problem Du lösen willst. Solch generierte ID's dienen normalerweise als PK, da gibt es keine Notwendigkeit, diese nach ästetischen Gesichtspunkten (Anzahl der Sommersprossen, Farbe der selbigen, $whatever) neu zu vergeben.
 
Mir ist nicht klar, welches Problem Du lösen willst. Solch generierte ID's dienen normalerweise als PK, da gibt es keine Notwendigkeit, diese nach ästetischen Gesichtspunkten (Anzahl der Sommersprossen, Farbe der selbigen, $whatever) neu zu vergeben.
Für diesen Fall macht es Sinn. Es wäre nett, wenn du mir sagen könntest, wie ich das lösen kann. Vielen Dank
 
Nun, hier eine mögliche Lösung:

Code:
test=*# create table huigc as select row_number() over (), random() from generate_series(1, 10) s;
SELECT 10
test=*# select * from huigc ;
 row_number |  random   
------------+--------------------
  1 | 0.0102278809063137
  2 |  0.954339728690684
  3 |  0.589826708193868
  4 |  0.725287229754031
  5 |  0.594287546351552
  6 |  0.272940550930798
  7 |  0.267028867732733
  8 |  0.899477043189108
  9 |  0.260732241906226
  10 |  0.600630340632051
(10 Zeilen)
test=*# with s as (select row_number() over (order by random), random from huigc ) update huigc set row_number = s.row_number from s where huigc.random=s.random;
UPDATE 10
test=*# select * from huigc ;
 row_number |  random   
------------+--------------------
  1 | 0.0102278809063137
  2 |  0.260732241906226
  3 |  0.267028867732733
  4 |  0.272940550930798
  5 |  0.589826708193868
  6 |  0.594287546351552
  7 |  0.600630340632051
  8 |  0.725287229754031
  9 |  0.899477043189108
  10 |  0.954339728690684
(10 Zeilen)

Das an Deine Tabelle anzupassen überlasse ich Dir zur Übung - allerdings wird das in MySQL nicht funktionieren. Macht aber nix, weil ich zu 100% der Meinung bin, daß Du einen konzeptionellen Fehler machst. Die ID-Spalte dient bei Dir als Primary Key, oder sie sollte es zumindest. Die neu zu vergeben ist schlicht Bullshit. Sortierung bei der Ausgabe bekommst Du mit einem passenden ORDER BY, ein passender Index kann helfen, dies auch zu beschleunigen. Deine Idee skaliert nicht, wenn die Tabelle mal größer wird. Es skaliert schon nicht mehr, wenn ein neuer Datensatz dazukommt. Die Idee ist schlicht Murks.
 
Genau die Lösung (ROW_NUMBER()) hat er schon versucht, das ist in Post #1 ist die MySQL-Variante davon. Ich kann aber leider nur sagen das ich das auch nicht hin kriege mangels MySQL. Alternativ kannst du eine Schleife oder einen Cursor probieren.
 
Werbung:
Zurück
Oben