MySQL: Feld auf Basis des Erstelldatums durchnummerieren

canju

Erfahrenes Mitglied
Hallo liebe Profi-Forengemeinde,

ich brauche mal wieder eure Hilfe.
Ich möchte auf Basis des Erstelldatums eines Eintrags das Feld „Anzahl“ durchnummerieren.

Sagen wir ich habe die Tabelle "Kontakte":
ID, Erstelldatum, Anzahl, User-ID (Hab leider nicht raus wie ich hier Tabellen einfügen kann)
1549362218120.png

Die Nummerierung des Feldes „Anzahl“ soll in der Tabelle „Kontakte“ pro Nutzer durchnummeriert werden. Der älteste Eintrag eines Nutzers erhält dann also die 1, der zweit älteste die 2 und so weiter.

Wäre prima wenn ihr mir (mal wieder) helfen könntet.

Beste Grüße,
Canju
 
Oder ein Stored Procedure.
Die geht Zeile um Zeile durch und blockiert die quelle nicht

Ich muss aber eingestehen, ich habe keine Ahnung wie performant das ganze ist Auch habe ich sehr wenig Ahnung von Stored Procedure in MySQL.

Nachtrag:
Es lohnen sich die folgenden Überlegungen.
- Nur Daten updaten, die wirklich neu berechnet werden müsse
- Indexe sauber setzen
SQL:
CREATE DEFINER=`root`@`localhost` PROCEDURE `sp1`()
    LANGUAGE SQL
    NOT DETERMINISTIC
    CONTAINS SQL
    SQL SECURITY DEFINER
    COMMENT ''
BEGIN
      DECLARE done INT DEFAULT 0;
    DECLARE v_id_c CHAR(36) DEFAULT '';
    DECLARE v_cnt INT DEFAULT 0;
    DECLARE cur1 CURSOR FOR
        SELECT (
                SELECT COUNT(*)
                FROM tw_1 AS tw2, tw_cstm AS cstm2
                WHERE 1
                    AND tw2.id = cstm2.id_c
                    AND cstm2.internal_user_id_c = cstm1.internal_user_id_c
                    AND cstm2.internal_cs_id_c = cstm1.internal_cs_id_c
                    AND tw2.date_entered <= tw1.date_entered
                    AND tw2.deleted = 0
                ) AS anzahl,
                tw1.id
            FROM tw_1 AS tw1, tw_cstm AS cstm1
            WHERE 1
                    AND tw1.id = cstm1.id_c;



    DECLARE CONTINUE HANDLER
    FOR NOT FOUND SET done = 1;

    OPEN cur1;

    get1: LOOP
        FETCH cur1 INTO v_cnt, v_id_c;
        IF done = 1 THEN
            LEAVE get1;
        END IF;
      
        update tw_cstm t
        set t.count_tw_c = v_cnt
        where t.id_c = v_id_c;
         -- build email list
    END LOOP get1;

-- count_tw_c


  END
 
Zuletzt bearbeitet:
Lieben Dank für deine Zeit.
Ist für mich auch schwere Kost gerade, bin immernoch am verdauen.

Mit der Prozedure bekomme ich direkt einen Syntax Fehler Line 8 was dann DECLARE done INT DEFAULT 0; wäre. Habe auch schon danach gegoogled, aber die Syntax in dem Bereich scheint korrekt auzusehen. (Ich benutze HeidiSQL als Client und die DB ist eine MariaDB was meinem Verständnis nach einwandfrei mit den Prozeduren kompatibel sein müsste).
Habe schon ein schlechtes Gewissen, aber hast du noch eine Idee hierzu?

Nachtrag:
Es lohnen sich die folgenden Überlegungen.
- Nur Daten updaten, die wirklich neu berechnet werden müsse
- Indexe sauber setzen
Ich werde im UPDATE später dann nur die Datensätze updaten lassen, die nicht schon durchlaufen wurden, um nicht immer alles nochmal durchlaufen zu müssen.

Btw.: Die Alternative mit der temporären Tabelle habe ich testweise auch mal durchlaufen lassen (Diese funktioniert wunderbar). Bei ca. 3k Datensätzen dauert es ~ 2min bis das Statement abgearbeitet ist. Bei der aktuell geplanten Skalierung wäre das schon ein ziemliches Brett.
 
Hm. Ich habe auch mit Heide getestet und es funktioniert. Ich habe es über "Create New->Sored routine" gemacht.
Wenn ich es als Script versuche komme ich auf den gleichen Fehler. Hab da aber was gefunden: How do I create a stored procedure in heidisql?

Und siehe da, es funktioniert
SQL:
DELIMITER $$
CREATE DEFINER=`root`@`localhost` PROCEDURE `sp2`()
LANGUAGE SQL
...

Dein Hauptproblem ist grundsätzlich, dass du auf verschieden Tabellen aufgeteilt hast in Kombination mit der Anforderung an die Laufzeit. Es wird mit der Stored Procedure wahrscheinlich nicht besser.
 
Zurück