MySQL: Feld auf Basis des Erstelldatums durchnummerieren


canju

Grünschnabel
#1
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
 

Yaslaw

n/a
Moderator
#2
EIn Klassiker
SQL:
select 
  k1.*,
  (
    select count(k2.*) 
    from kontakte k2 
    where k2.userid = k1.userid 
      and k2.erstelldatum <= k1.erstelldatum
  ) as anzahl
from kontakte k1
 

canju

Grünschnabel
#3
Hey Yaslaw,

wiedermal danke für die prompte Antwort.

Ich hätte vielleicht direkt beim ersten Post erwähnen sollen, dass sich die eigtl. userid in einer separaten Tabelle (id_mapping) befindet. Ich scheitere jetzt an dem LEFT JOIN um die die userid "rüber" zu bekommen

SQL:
select
  k1.*,
  (
    select count(k2.*)
    from kontakte k2
    left join id_mapping im2 on k2.id = im.internal_id
    where im2.internal_id = im1.internal_id
      and k2.erstelldatum <= k1.erstelldatum
  ) as anzahl
from kontakte k1
left join id_mapping im1 on k1.id = im.internal_id
Zudem scheint es Probleme bei count(k2.*) zu geben. Mein Client (HeidSQL) gibt mir immer einen Syntax Fehler an dieser Stelle zurück, wenn ich den Query (ohne left join) abschicke. Ändere ich das count(k2.*) in bspw. count(k2.id) - also auf ein vorhandenes Feld - wird kein Syntax Fehler mehr ausgeworfen.

Kannst du nochmal in meine Unwissenheit eingreifen?
 

canju

Grünschnabel
#5
Die User-ID liegt in der Tabelle id_mapping.
Die Nummerierung des Felds Anzahl soll doch pro User UND auf Basis des Erstelldatums gemacht werden. Das Feld Anzahl werde ich auch als Feld anlegen und die Nummerierung dort drin speichern.

Das Ergebnis soll sein, dass ich die Felder"Anzahl", "Startort", "Zielort" in der Tabelle Kontakte per CONCAT in das Feld "Beschreibung" via Cron UPDATEn lassen, sofern neue Einträge in der Tabelle Kontakte hinzukommen.

--> [Anzahl], '. Fahrt von ', [Startort], ' nach ', [Zielort]
----> 1. Fahrt von Berlin nach Hamburg

Alle Felder liegen dabei in der Tabelle Kontakte, bis auf die User-ID, die ich irgendwie mit "verwursten" muss, damit die Nummerierung nicht nur pro Eintrag durchgeführt wird sondern pro Eintrag UND User.
 

Yaslaw

n/a
Moderator
#6
Gibts auch Fahrten ohne User? Wenn nicht, dann mach kein LEFT JOIN sondern ein INNER JOIN

SQL:
select
    k1.*,
    im1.user_id,
    (
        select count(*)
        from kontakte k2, id_mapping im2
        where k2.id = im2.internal_id
            and im2.internal_id = im1.internal_id
            and k2.erstelldatum <= k1.erstelldatum
    ) as anzahl
from kontakte k1, id_mapping im1
where k1.id = im1.internal_id