Information ausblenden
Willkommen im Forum für alle Datenbanken! Registriere Dich kostenlos und diskutiere über DBs wie Mysql, MariaDB, Oracle, Sql-Server, Postgres, Access uvm

Index sortieren

Dieses Thema im Forum "MySQL und MariaDB" wurde erstellt von huigc001, 7 Juli 2017.

  1. huigc001

    huigc001 Benutzer

    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;
     
  2. akretschmer

    akretschmer Datenbank-Guru

    Gern. Aber keiner hier weiß, was Du versucht hast und was passiert ist. Daher kann (vermutlich) auch keiner Dir helfen.
     
  3. huigc001

    huigc001 Benutzer

    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
     
  4. huigc001

    huigc001 Benutzer

    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
     
  5. akretschmer

    akretschmer Datenbank-Guru

    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.
     
  6. huigc001

    huigc001 Benutzer

    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
     
  7. akretschmer

    akretschmer Datenbank-Guru

    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.
     
  8. ukulele

    ukulele Datenbank-Guru

    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.
     
  9. akretschmer

    akretschmer Datenbank-Guru

    Alternativ wäre eher, die Idee, einen (offensichtlichen) PK neu zu vergeben, zu überdenken.
     
  10. ukulele

    ukulele Datenbank-Guru

    Das ist sicherlich ein guter Rat aber keine Alternative da er das ursprüngliche Problem, das MySQL keine Durchnummerierung der Datensätze hinbekommt, damit nicht los wird.
     
Die Seite wird geladen...

Diese Seite empfehlen

  1. Diese Seite verwendet Cookies. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies.
    Information ausblenden