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
 
Ich habe dir dreisterweise eine PN geschickt, da ich das in fiddle nicht wirklich mit aussagekräftigen Testdaten füllen kann. Den weiteren Verlauf können wir dann gerne für ggf. andere Interessenten hier im Thread klären.
Hoffe du verzeihst mir die eine PN.
 
Dein Select bringt mit den Testdaten immer nur Anzahl=1. Ist das gewollt?
SQL:
-- Dein Select
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.*
FROM tw_1 AS tw1, tw_cstm AS cstm1
WHERE 1 
		AND tw1.id = cstm1.id_c

ORDER BY tw1.date_entered ASC
 
Hmm, eigtl. nicht es müsste bis ca. 6-8 hochzählen. Ich schaue mir das nacher nochmal an und geb dir bescheid.
 
Zum eigentlichen Problem. Ist die Frage, ob das ein einmaliger oder seltener Prozess ist, oder etwas das im Minutentakt durchgeführt wird.
Beim ersteren könntest du den bequemen Weg über eine Temporary Table gehen.
SQL:
-- drop table t_prepare;

create TEMPORARY table t_prepare 
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.*
 FROM tw_1 AS tw1, tw_cstm AS cstm1
 WHERE 1 
		AND tw1.id = cstm1.id_c
;

UPDATE tw_cstm AS cstm1, tw_1 AS tw1, t_prepare AS vw
SET cstm1.count_tw_c= anzahl
WHERE cstm1.id_c = vw.id;
 
Der Cron wird einmal die Minute (Je nach Laufzeit evtl. auch alle 2 oder 3 Minuten) laufen müssen, da das UPDATE Ergebniss so schnell wie möglich sichtbar sein muss.
 
ich denke das wird wird id_c sein

tw_cstm enthält ergänzende Felder zu dem gleichen datensatz aus tw_1

sprich über den join von id aus tw_1 und id_c aus tw_cstm lassen sich die datensätze zu einem "zusammenführen"
also der datensatz stellt quassi erst den gesamte eintrag dar indem wir den JOIN durchführen.
 
ich denke das wird wird id_c sein

tw_cstm enthält ergänzende Felder zu dem gleichen datensatz aus tw_1

sprich über den join von id aus tw_1 und id_c aus tw_cstm lassen sich die datensätze zu einem "zusammenführen"
also der datensatz stellt quassi erst den gesamte eintrag dar indem wir den JOIN durchführen.

Vielleicht noch kurz ergänzend:
Ich habe im Querry eine Dimension in der Unterabfrage ergänzt:
AND cstm2.internal_cs_id_c = cstm1.internal_cs_id_c

Sodass gemäß dem Erstelldatum (date_entered), pro internal_user_id_c und pro internal_cs_id_c hochgezählt werden soll. Und es sollen nur Einträge berücksichtigt werden die nicht gelöscht wurden (AND tw2.deleted = 0)
Der Query den du zuletzt hier geposted hast ist also weiterhin der, der mir die Anzahl korrekt ausgibt:

SQL:
SELECT
    cstm1.count_tw_c,
    (
    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.*,
    cstm1.*
FROM tw_1 AS tw1, tw_cstm AS cstm1
WHERE 1
        AND tw1.id = cstm1.id_c
ORDER BY tw1.date_entered ASC
Nach dem neuen Schema-Export das ich dir zukommen lassen habe sollte dir jetzt also die Anzahl wieder korrekt angezeigt werden.
 
Zurück