update bestimmter datensätze , neue reihenfolge deklarieren

  • Update Funktion MYSQL
    ich trage in eine Tabelle folgende Datensätze aus einer Anwendung ein
    DS1 - DS5 id,auftrag, position, nummer, bezeichnung, upe,...
    Bsp:
    1, 0815, 1, 007, muster, 125.00,..
    2, 0815, 3, 008, müster, 126.00,..
    3, 0815, 5, 009, mister, 127.00,..
    4, 0815, 6, 100, mist, 98.00,...
    5, 0815, 7, 101, müste, 55.30,...

    soweit ist alles io, nur müsste die position aller datensätze des auftrages 0815 so geändert werden, dass eine fortlaufende nummerierung erfolgt:

    1, 0815, 1, 007, muster, 125.00,..
    2, 0815, 2, 008, müster, 126.00,..
    3, 0815, 3, 009, mister, 127.00,..
    4, 0815, 4, 100, mist, 98.00,...
    5, 0815, 5, 101, müste, 55.30,...

    Wer kann helfen?
    Die id ist im richtigen Leben etwas umfangreicher '38ED25D64C7B6341C1257D870'

    folgende abfrage bringt schon mal die anzahl der datensätze je auftrag
    Select A.Auftrag, A.position, Count(*) As Anzahl
    From tabelle A
    Group By A.Auftrag, A.position

    nur eine verwendung dieser abfrage als update

    Update tabelle A
    Inner Join
    (Select A.Auftrag, A.position, Count(*) As Anzahl
    From tabelle AS A Inner Join tabelle AS B
    On A.position = B.position And A.auftrag>= B.auftrag
    Group By A.auftrag, A.position) AS C
    Set A.position= C.Anzahl
    where A.auftrag = C.auftrag

    trägt falsche werte ein...... :(

    Zwischenlösung generiert, diese funktioniert, bin mir sicher, dass das nicht das Optimum ist

    ' genriere Temporäre Tabelle....

    CREATE TABLE l_tmp_'0815' (
    `position` smallint(5) NOT NULL AUTO_INCREMENT,
    `ID` varchar(35) COLLATE latin1_german1_ci NOT NULL DEFAULT '',
    `auftrag` varchar(30) COLLATE latin1_german1_ci NOT NULL DEFAULT '',
    PRIMARY KEY (`posID`)
    ) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_german1_ci ROW_FORMAT=DYNAMIC;
    insert into l_tmp_'0815' (ID, auftrag)
    select ID, auftrag from tabelle_a
    where ID = '0815';
    update tabelle_a l, l_tmp_'0815' t
    set l.position = t.position
    where l.ID = t.ID;
    DROP Table l_tmp_'0815';

    Vielen Dank allen Beteiligten, :)

    3 Mal editiert, zuletzt von deinVater (18. September 2015 um 10:27)