Neuigkeiten
  • Die modified eCommerce Shopsoftware ist kostenlos, aber nicht umsonst.
    Spenden
  • Damit wir die modified eCommerce Shopsoftware auch zukünftig kostenlos anbieten können:
    Spenden
  • Thema: Alte Kunden ohne Bestellung löschen, d.h. Karteileichen entfernen. Wie?

    0815

    • Viel Schreiber
    • Beiträge: 905
    Hallo,

    Ich würde gerne alle Kunden löschen die sich vor mehr als einem Jahr registriert, aber noch nie bestellt haben.

    Hier gibt es eine Abfrage, wie man restlos alle Kunden entfernt:
    https://www.modified-shop.org/wiki/Kunden_l%C3%B6schen

    Kann man das nach meinen o.g. Vorgaben irgendwie anpassen?
    Ist mir leider zu komplex, weshalb ich mich sehr über Hilfe freuen würde.

    Danke

    Linkback: https://www.modified-shop.org/forum/index.php?topic=41059.0

    0815

    • Viel Schreiber
    • Beiträge: 905
    Diese Abfrage liefert alle Kunden, die noch nie bestellt haben:

    Code: SQL  [Auswählen]
    SELECT c.customers_id FROM customers AS c
    WHERE NOT EXISTS (SELECT *
    FROM orders o
    WHERE  c.customers_id = o.customers_id)

    Wie kann ich die Abfrage auf alle Kunden mit Registrierung vor z.B. 01.01.2019 eingrenzen?

    fiveBytes

    • Mitglied
    • Beiträge: 117
    • Geschlecht:
    Sollte mit

    Code: SQL  [Auswählen]
    SELECT c.customers_id FROM customers AS c
    WHERE c.customers_date_added < "01.01.2019" AND NOT EXISTS (SELECT *
    FROM orders o
    WHERE c.customers_id = o.customers_id);

    funktionieren.

    0815

    • Viel Schreiber
    • Beiträge: 905
    in der Spalte customers_date_added steht leider bei vielen Kunden 0000-00-00 00:00:00.
    Jetzt sollte man meinen, dann stände bei diesen Kunden weningstens in customers_last_modified ein Datum, aber bei vielen Kunden steht leider in beiden Spalten 0000-00-00 00:00:00.

    Gut, dachte ich mir, versuche ich es mal hiermit:
    Code: SQL  [Auswählen]
    SELECT c.customers_id FROM
    customers AS c,
    customers_status_history AS csh
    WHERE NOT EXISTS (SELECT *
    FROM orders o
    WHERE c.customers_id = o.customers_id)
    AND c.customers_id = csh.customers_id
    AND csh.date_added < date_add(CURRENT_DATE, INTERVAL -365 DAY)

    Leider gibt es nicht zu jedem Kunden in der Tabelle customers_status_history einen Eintrag.

    Verfahrene Situation. :datz:

    Notlösung wäre nun m. E. nur noch, die letzte, min. 1 Jahr alte customers_id zu ermitteln und diese als Limit zu setzen.
    Da ich jedoch eine Abfrage fürs Bakend erstellen wollte, ist das eigentlich keine gute Lösung.

    0815

    • Viel Schreiber
    • Beiträge: 905
    So scheint es zu funktionieren:

    Code: SQL  [Auswählen]
    SELECT c.customers_id FROM
    customers AS c,
    customers_info AS ci
    WHERE NOT EXISTS (SELECT *
    FROM orders o
    WHERE c.customers_id = o.customers_id)
    AND c.customers_id = ci.customers_info_id
    AND ci.customers_info_date_account_created < date_add(CURRENT_DATE, INTERVAL -365 DAY)

    Die Tabelle customers_info hatte ich übersehen.
    Ich nehme an, die customers_id aus der Tabelle customers entspricht dabei der customers_info_id in der Tabelle customers_info. Ist das korrekt?

    Scubi

    • Mitglied
    • Beiträge: 220
    Du sprichst also nicht von Kunden. denn das sind Menschen die schon mal bestellt haben, sondern von Gastkunden. Da wird es sicherlich nen Unterschied geben, diese zu löschen.

    voodoopupp

    • Fördermitglied
    • Beiträge: 1.852
    • Geschlecht:
    Nicht zwingend: wir haben viele, die sich mal irgendwann als Kunden angemeldet haben und schlußendlich nicht bestellt haben.
    Somit sind Kunden im Sinne vom Shopsystem nicht zwingend auch gleich kaufende Kunden gemeint ;)

    Grüße
    Dominik

    0815

    • Viel Schreiber
    • Beiträge: 905
    "Gast-Kunden" sind bei uns deaktiviert.

    Ich möchte alle Kunden löschen, die sich vor mehr als einem Jahr registiert, aber nie bestellt haben.

    In der Sache bin ich seit gestern auch schon ein wenig weiter, aber ich muss mich jetzt zuerst mal ums Tagesgeschäft kümmern.
    Später am Tag, wenn alles verpackt und versendet ist, geht's weiter.

    Q

    • Fördermitglied
    • Beiträge: 1.502
    Man könnte auch "Kundenkonten", "Accounts" , usw. sagen. Die Masse dürfte verstanden haben, was 0815 meint.

    Wenn du die Infos in der Tabelle customer gelöscht hast, nicht vergessen noch in customers_info die Einträge raus zu schmeisen und ggf. im Adressbuch.

    noRiddle (revilonetz)

    • Experte
    • Beiträge: 13.743
    • Geschlecht:
    Das Problem mit dem Datum ist unlösbar. Ein *_date_added oder *_date_account_created mit 0000-00-00 00:00:00 läßt sich nun mal nicht mehr zeitlich bestimmen. Ich würde mich fragen wie das zustande kommen kann.
    Wenn es Altlasten sein könnten und jedes neu erstellte Konto immer einen Eintrag in die customers und die customers_info macht dürftest du davon ausgehen können, daß es irgendwelche Altlasten sind (wir kennen die Geschichte des Shops ja nicht).
    Jedenfalls würde ich simpler vorgehen, um nicht eine zu komplexe Query zu haben die dann eher Gefahr läuft  fehlerbehaftet zu sein.
    Das Format des Datums in deinen Beispielen ist übrigens verkehrt.

    Code: SQL  [Auswählen]
    DELETE FROM customers
     WHERE (customers_date_added < '2019-01-01 00:00:00' OR customers_date_added = '0000-00-00 00:00:00')
       AND customers_id NOT IN (SELECT customers_id FROM orders);

    Und dann einfach alle weiteren Tabellen in welchen sich Kundendaten befinden folgendermaßen gemessen an der bereits bereinigten customers-Tabelle bereinigen:

    Code: SQL  [Auswählen]
    DELETE FROM address_book WHERE customers_id NOT IN (SELECT customers_id FROM customers;

    Achtung, wie bereits selbst bemerkt customers_info_id;
    Code: SQL  [Auswählen]
    DELETE FROM customers_info WHERE customers_info_id NOT IN (SELECT customers_id FROM customers;

    Code: SQL  [Auswählen]
    DELETE FROM ccustomers_ip WHERE customers_id NOT IN (SELECT customers_id FROM customers;

    Achtung, hier muß mangels customers_id mit customers_email_address verglichen werden:
    Code: SQL  [Auswählen]
    DELETE FROM customers_login WHERE customers_email_address NOT IN (SELECT customers_email_address FROM customers;

    Code: SQL  [Auswählen]
    DELETE FROM customers_memo WHERE customers_id NOT IN (SELECT customers_id FROM customers;

    Code: SQL  [Auswählen]
    DELETE FROM customers_status_history WHERE customers_id NOT IN (SELECT customers_id FROM customers;

    Daß vor jeglicher DELETE-Aktion alle Tabellen gesichert werden sollten versteht sich von selbst.

    Gruß,
    noRiddle

    *NACHTRAG*
    NOT IN anstatt NOT EXISTS ist hier ein wenig effektiver und ergibt auch keine verkehrten Ergebnisse, da die verglichenen Werte nicht NULL sein können.
    (siehe z.B. NOT IN vs. NOT EXISTS vs. LEFT JOIN / IS NULL: MySQL
    oder
    MySQL: When NOT IN Is Not Equal to NOT EXISTS)

    0815

    • Viel Schreiber
    • Beiträge: 905
    Zitat
    Das Problem mit dem Datum ist unlösbar. Ein *_date_added oder *_date_account_created mit 0000-00-00 00:00:00 läßt sich nun mal nicht mehr zeitlich bestimmen. Ich würde mich fragen wie das zustande kommen kann.

    Das Datum aus der Tabelle customers_info sollte das Problem doch lösen. So wie in meinem letzten Beitrag geschrieben.
    Oder nicht, d.h. habe ich da was falsch verstanden?

    Was ist mit dem Format des Datums in meiner Abfrage falsch? Kannst Du das bitte kurz erklären, denn es erschließt sich mir nicht.
    Ich war eigentlich auch der Meinung, dass meine Select-Abfrage so richtig ist. Die Werte, welche mir ausgegeben wurden scheinen auch korrekt.

    Danke

    noRiddle (revilonetz)

    • Experte
    • Beiträge: 13.743
    • Geschlecht:
    Wenn du bei den Kunden die in der Tabelle customers kein *_date_added haben, in der Tabelle customers_info aber gar wohl ein *_date_account_created, dann nimmst du halt das Datum (mittels eines JOINs auf customers).

    Datumsformat:
    Was ist hieran nicht zu sehen ?
    Du:
    Code: SQL  [Auswählen]
    WHERE c.customers_date_added < "01.01.2019"

    Richtig:
    Code: SQL  [Auswählen]
    WHERE c.customers_date_added < "2019-01-01"

    Und dabei muß man noch bedenken, daß, da es sich in der DB um ein datetime-Feld handelt, mySQL die Zeit mit 00:00:00 selbstständig ergänzt wenn man lediglich mit Datum (also ohne Zeit) vergleicht.

    Gruß,
    noRiddle

    0815

    • Viel Schreiber
    • Beiträge: 905
    Der Beitrag mit dem falschen Datumsformat war von fiveBytes und nicht von mir. Deshalb hatte ich nicht verstanden was bei mir falsch sein soll.

    Der letzte Stand meiner Abfrage war ein paar Beiträge weiter darunter:

    Code: SQL  [Auswählen]
    SELECT c.customers_id FROM
    customers AS c,
    customers_info AS ci
    WHERE NOT EXISTS (SELECT *
    FROM orders o
    WHERE c.customers_id = o.customers_id)
    AND c.customers_id = ci.customers_info_id
    AND ci.customers_info_date_account_created < date_add(CURRENT_DATE, INTERVAL -365 DAY)

    In der Tabelle customers_info haben scheinbar alle Kunden ein verwertbares Datum in meiner Datenbank.
    Nur in der Tabelle customers sah es anders aus.

    Q

    • Fördermitglied
    • Beiträge: 1.502
    Das Problem mit dem Datum ist unlösbar. Ein *_date_added oder *_date_account_created mit 0000-00-00 00:00:00 läßt sich nun mal nicht mehr zeitlich bestimmen. Ich würde mich fragen wie das zustande kommen kann.
    Wenn es Altlasten sein könnten und jedes neu erstellte Konto immer einen Eintrag in die customers und die customers_info macht dürftest du davon ausgehen können, daß es irgendwelche Altlasten sind (wir kennen die Geschichte des Shops ja nicht).

    Ich hatte das mal im Zuge des Themas Thema: Doppelte Informationen in DB bei 'customers' und 'customers_info'? vor ein paar Tagen/Wochen durchgeschaut. Irgendwo habe ich mir auch aufgeschrieben, vor welchem Datum diese 0er Einträge in der customers stehen. Meine das war 2006 oder 2013. Finde den Zettel gerade nur nicht.

    Auch beim Thema DSGVO hatte ich das Löschen von "Karteileichen" und den unterschiedlichen Spalten angesprochen. Da wurde in einem Shop-Update die Einträge für "last_login" (glaub ich)  soweit angepasst, dass dort bei Kunden die sich nur das Konto angelegt haben auch den Eintrag der Erstellung drin stehen haben, um dann danach die sehr lange inaktiven Konten identifizieren zu können.

    Q

    • Fördermitglied
    • Beiträge: 1.502
    Habs wieder gefunden:
    THEMA: DATENHYGIENE FÜR DIE DSGVO
    Bei den Kunden würde ich aber als Grundlage aus der Tabelle customers_info die Werte aus customers_info_date_of_last_logon oder wenn diese leer (NULL) sind customers_info_date_account_created nehmen.

    Zitat
    - Fix #1510 DSGVO - bei account creation einen last login hinzufügen
    Kam mit 2.0.5.0.
    Shop Hosting
    1 Antworten
    2429 Aufrufe
    08. Juni 2015, 20:23:47 von sylsch
    19 Antworten
    7975 Aufrufe
    25. August 2017, 17:09:42 von fishnet
    5 Antworten
    4428 Aufrufe
    03. Juli 2018, 12:13:01 von Tomcraft
    11 Antworten
    8868 Aufrufe
    19. Januar 2012, 14:23:57 von Tomcraft