Systematisches Ändern

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Systematisches Ändern

    Ich weiß leider nicht, wie ich das am besten formulieren sollte (im Titel).

    Folgende (vereinfachte) Tabellen-Struktur:

    u_id INT
    f_id INT AUTO_INC UNIQUE
    f_pos TINT

    Jede U_ID kann in der Tabelle 1-10 Mal vorkommen (X).
    F_POS soll bei jeder U_ID von 1 bis X sein.

    Das wäre an sich kein Problem, wenn die F_POS-Spalte nicht nachträglich hinzugekommen wäre. Nun enthält F_POS bei jedem DS denselben Wert (NULL oder 1 oder was auch immer, spielt ja keine Rolle).

    Das Problem besteht nun darin, die F_POS-Werte zu vergeben. Mal ein Beispiel, wie es z.B. am Ende aussehen soll:

    U_ID - F_ID - F_POS

    1 - 1 - 1
    1 - 2 - 2
    1 - 3 - 3
    2 - 4 - 1
    2 - 5 - 2
    3 - 6 - 1
    4 - 7 - 1
    5 - 8 - 1
    5 - 9 - 2
    5 - 10 - 3
    5 - 12 - 4
    5 - 13 - 5

    usw.

    Eine Abhängigkeit zwischen F_ID und F_POS gibt es nicht. U_ID und F_ID sind bereits fest eingetragen.

    Wie kann ich das nun automatisch machen? Die Tabelle hat ein paar Tausend Datensätze.

    Eine Möglichkeit wäre natürlich, für jede U_ID in einer Schleife die F_POS zu vergeben, aber das wären ja X Tausend SQL-Abfragen und ich hoffe, dass es eine andere Lösung gibt.

    Kann mir jemand helfen?

    Schon mal vielen Dank.

    DasD

  • #2
    Mit UPDATE und 2 Uservariablen geht das nachdem Du die Spalte eingefügt hast ...

    Mit

    SET @u_id = 0, @f_pos = 0;

    initialisieren ... und dann in 'nem Update auf die beiden Variablen zugreifen ... (@f_pos auf 0 setzen wenn u_id != @u_id, @f_pos:=f_pos+1, f_pos = @f_pos ...)
    carpe noctem

    [color=blue]Bitte keine Fragen per EMail ... im Forum haben alle was davon ... und ich beantworte EMail-Fragen von Foren-Mitgliedern in der Regel eh nicht![/color]
    [color=red]Hinweis: Ich bin weder Mitglied noch Angestellter von ebiz-consult! Alles was ich hier von mir gebe tue ich in eigener Verantwortung![/color]

    Kommentar


    • #3
      Danke für die Antwort. Ich habe mir die Sache mit den Benutzervariablen angeschaut und vermutlich auch verstanden. Doch scheinbar kann man sie nicht bei Updates verwenden?

      Folgende Query habe ich versucht:

      update tbl_blah set @f_pos=IF(u_id!=@u_id,0,@f_pos), @f_pos:=f_pos+1, f_pos=@f_pos, @u_id:=u_id

      Dann habe ich sie verkürzt zu

      update tbl_blah set @f_pos=IF(u_id!=@u_id,0,f_pos+1), f_pos=@f_pos, @u_id:=u_id

      Die Fehlermeldung:

      blah blah syntax to use near '@f_pos=IF(u_id!=@ blah blah

      Sollte es an der Initialisierung liegen? In einer Query kann ich sie ja nicht initialisieren, also habe ich vor der obigen Query die "set @f_id=0, @u_id=0" ausgeführt. Die Fehlermeldung bleibt dieselbe

      Nachtrag: Natürlich habe ich es auch mit ... set @f_pos:=IF( ... probiert, aber daran scheint es nicht zu liege. Er mag an sich die Variable nicht an dieser Position. Doch wohin sonst damit?

      Kommentar


      • #4
        Im UPDATE ohne SET ... dafür mit @variable:=wert ... sekunde ich bastele selber mal ... !
        Zuletzt geändert von goth; 22.09.2004, 23:45.
        carpe noctem

        [color=blue]Bitte keine Fragen per EMail ... im Forum haben alle was davon ... und ich beantworte EMail-Fragen von Foren-Mitgliedern in der Regel eh nicht![/color]
        [color=red]Hinweis: Ich bin weder Mitglied noch Angestellter von ebiz-consult! Alles was ich hier von mir gebe tue ich in eigener Verantwortung![/color]

        Kommentar


        • #5
          Du hast Recht ... das Problem ist, dass bei jedem Ausdruck auf jeden Fall ein Attribute einen Wert bekommen muss ... ich benutze sowas meistens in Select-Statements ... Ausweg:

          Eine zusätzliche Spalte, die Du nach der Konvertierung wieder entfernst ... füge also eine Spalte "dummy int(11) unsigned" ein ... dann folgende beiden Statements:

          Code:
          SET @u_id=0, @f_pos=0;
          UPDATE tbl_blah SET dummy=@f_pos:=IF(@u_id=u_id, @f_pos, 0), dummy=@u_id:=u_id, f_pos=@f_pos:=@f_pos + 1;
          dummy wieder entfernen ... vorher noch kontrollieren das die Werte passen ...

          Mag sein das es auch kürzer geht .. bin heute schon etwas lange auf .. !
          Zuletzt geändert von goth; 23.09.2004, 16:20.
          carpe noctem

          [color=blue]Bitte keine Fragen per EMail ... im Forum haben alle was davon ... und ich beantworte EMail-Fragen von Foren-Mitgliedern in der Regel eh nicht![/color]
          [color=red]Hinweis: Ich bin weder Mitglied noch Angestellter von ebiz-consult! Alles was ich hier von mir gebe tue ich in eigener Verantwortung![/color]

          Kommentar


          • #6
            Besten Dank. Hatte schon befürchtet, dass auch das nicht geht, da nicht alle DS richtig geändert wurden. Lag aber daran, dass SQL die DS der Reihe nach ändert. Wenn die Reihenfolge in der DB z.B. so aussieht:


            u_id
            1
            1
            1
            2
            2
            1
            3
            1

            sieht das Ergebnis dann so aus:

            u_id - f_pos
            1 - 1
            1 - 2
            1 - 3
            2 - 1
            2 - 2
            1 - 1
            3 - 1
            1 - 1

            Was auch logisch ist. Habe dann noch ein ORDER BY u_id hinzugefügt und damit läuft das einwandfrei.

            An eine Lösung mit einer Hilfsspalte habe ich gestern auch schon gedacht, nur ist mir leider keine logisch erscheinende Lösung eingefallen *G*.

            Nochmals danke

            DasD

            Kommentar

            Lädt...
            X