Daten umkopieren

OhnePlanKeinElan

Neuer Benutzer
Beiträge
4
Hallo zusammen,

ich habe eine Wordpress DB-Tabelle (MySQL), wo Einträge aus dem Kontaktformular gespeichert werden. Da ich das Kontaktformular umgebaut habe, möchte ich die Daten "nachziehen". Wie sieht die IST-Situation aus:

Die Details werden wie folgt gespeichert:

id; lead_id; name; value
4382; 392; mailadresse; abc@test.de
4381; 392; mail2; NULL:
4380; 391; ganz-anderes-feld; status
4389; 391; ganz-anderes-feld2: NULL
4354; 364; mailadresse; beispiel@host.de
4353; 364; mail2; NULL:

ID ist eine fortlaufende Nummer, LEAD_ID identifiziert Datensätze des Kontaktformulars, name ist der Name des Feldes und Value dessen Inhalt.

Die lead_id bekomme ich aus einer anderen Tabelle, wo ich nach der Kennung des Formulars suche. Das sieht dann wie folgt aus:

id; form_id; status; url
392; cf_98; 0; www.test.de/A
391; cf_50; 0 www.test.de/B
364; cf_98; 0; www.test.de/A

Das Kontaktformular hat als form_id cf_98, also alle IDs für cf_98 sind Einträge zum Kontaktformular. In der Detailtabelle werden diese als lead_id identifiziert.

Nun möchte ich für alle IDs/lead_ids von form_id cf_98 in der Detailtabelle den Wert des Feld value bei mail2 mit dem Inhalt des Feldes value von mailadresse aktualisieren. Für das Beispiel wäre es also:

4382; 392; mailadresse; abc@test.de
4381; 392; mail2; abc@test.de
4380; 391; ganz-anderes-feld; status
4389; 391; ganz-anderes-feld2: NULL
4354; 364; mailadresse; beispiel@host.de
4353; 364; mail2; beispiel@host.de

Ich komme einfach nicht auf die Lösung. Habt ihr einen Tipp??

Danke.
 
Werbung:
Irgendwas fehlt mir da. Es muss eine weitere Dimension / ID geben.
Wenn es das nicht gibt, würden wir ja gemäß Deines Beispiels nur von 2 Einträgen reden, die zu aktualisieren sind. Auch ohne meinen Beitrag wäre so der Aufwand für diesen Thread hier deutlich größer als der Nutzen.
 
Hallo dabadepdu,

danke für Deine Antwort. Nein, es fehlt keine weitere ID. In der Tabelle mit der form_Id finde ich zu cf_98 insgesamt 142 Einträge/ids. Ein Select über form_id cf_98 ist einfach und definiert die Menge der zu ändernden Einträge in der Detail-Tabelle. Dort gibt es für jede der gefundenen 142 IDs jeweils zwei Einträge, wie dargestellt. Ich will quasi für jeden der 142 Einträge den Inhalt des value-Feldes aus der einen Detailzeile in die andere kopieren.

Die erste Tabelle sieht so aus:

a.png

Die Detailtabelle so:

b.png

Die Tabellen kommen von Standard-WP-Plugins. Die ID aus der oberen Tabelle zeigt auf lead_id in der unteren.

Verständlicher? Vielleicht ist die Lösung auch trivial und ich einfach nur zu blond.
 
Zuletzt bearbeitet:
Verständlicher? Vielleicht ist die Lösung auch trivial und ich einfach nur zu blond.
Ich glaub ich habe es verstanden. Die Dimension, die mir fehlte, war die lead_id, die ich anhand der Beschreibung zunächst für 2 Konstanten gehalten habe. Die Handhabung von Key-Value Tabellen und korrelierten Updates ist m.E. nicht SQL Anfänger Stoff, die Haarfarbe spielt da sicher nicht rein.

Also, es geht im Prinzip um ein Update mit korrelierter Unterabfrage (correlated subquery). Sowas ist immer dann nötig, wenn mehrer Zeilen betroffen sind, der Zielwert nicht statisch ist und nicht aus dem Zielrecord abgeleitet werden kann (aber aus anderen Quellen).
Weil sowas gar nicht selten ist, aber trotzdem eine Standardsituation (Fußball), habe ich das mal etwas ausführlicher beschrieben. Das kann man immer so lösen, sobald man kapiert hat, dass dieser Fall vorliegt.
Das Ganze dann noch in einer Key Value Tabelle. Ist in diesem Fall aber nicht so dramatisch, weil es sich in Quelle und Ziel relativ einfach auf jeweils 1 Datensatz reduzieren lässt.

Code:
update table_a as target
  join table_b as source
    on target.id = source.id -- (irgendein join Kriterium halt)
   set <set neue Werte >
 where <irgendein Filterkriterium>

Deine Source Daten sind wiederum nicht aus einer Tabelle zu beschaffen, also braucht man einen Join zwischen den beiden genannten Tabellen.
Code:
select f.id, d.value from form f 
  join detail d on f.id=d.lead_id 
 where f.form_id = 'cf_98' 
   and d.name = 'mailadresse';

Pattern ausfüllen und mit dem Subselect zusammenbauen.
Damit hast Du alle benötigten Quelldaten und Joinkriterien. Du kannst jetzt alle DS in der Detailtabelle individuell updaten, alle die gefiltert name = mail2 erfüllen.

Code:
*
update detail as target
  join (select f.id, d.value from form f 
          join detail d on f.id=d.lead_id 
         where f.form_id = 'cf_98' 
           and d.name = 'mailadresse') source
    on target.lead_id = source.id
   set target.value = source.value
 where target.name = 'mail2'

* vielleicht geht es auch hübscher/besser. Da ich mySQl/mariaDB niemals einsetzen würde, kenn ich mich mit spezifischen Syntaxvarianten dort nicht aus. Die Syntax für Updates mit Subqueries unterscheidet sich leider zwischen den verschiedenen Systemen.
 
Hallo dabadepdu,

bitte entschuldige meine späte Antwort auf Deine Unterstützung. Beruflich war ich in den letzten Tagen unterwegs, so dass ich erst jetzt zum ausprobieren gekommen bin. Lange rede kurze Sinn: Phantastisch! Es hat sehr gut geklappt. Vielen vielen Dank. Insbesondere für Deine ausführliche Erklärung, welche das alles sehr verständlich gemacht hat.

Es ist ja heute nicht mehr selbstverständlich, dass einem im Netz so geholfen wird. Daher vielen Dank. Ich weiß es sehr zu schätzen.
Wirklich toll! :D

Vielen Dank und ein schönes Wochenende.
OhnePlanKeinElan
 
Ja, finde ich. Ich habe es ja mit der freien Version von chatgpt probiert, aber kam mit den antworten nicht weiter. So "maßgeschneiderte" Antworten auf individuelle Fragen sind nicht mehr üblich, finde ich. Daher vielen Dank für den wertvollen Input. :D
 
Werbung:
Ich habe es ja mit der freien Version von chatgpt probiert, aber kam mit den antworten nicht weiter
Interessantes Thema, kleiner Ausflug

ot
Man kann sich gut darüber streiten, woran es liegt, wer was besser kann, Mensch oder Suchmaschine, Ursache und Wirkung..
Wenn man mal diejenigen beiseite lässt, die es sich mit einer Anfrage in einem Forum möglichst leicht machen (ohne selbst nach Antworten und Verständnis zu suchen), stecken hier viele interessante Probleme in dem Phänomen:
Ich habe x Stunden gegooglet, aber keine passende Antwort gefunden.
Ich glaube es ist kein Geheimnis, dass die google Suche nicht daran scheitert, dass es keine Lösung für das Problem gibt, sondern daran, dass die falschen Suchworte benutzt werden. Falsche Suchworte haben eigentlich nur eine Ursache, die passenden Begriffe zum Sachverhalt sind dem Suchenden nicht bekannt.
Es gibt noch eine Variante: es existiert kein Wort für das Problem. Das wird dann etwas schwieriger mit der Suche.
Aber es liegt auf der Hand und ist irgendwie auch banal, die richtigen Worte sind der Schlüssel für eine erfolgreiche Suche.
Ich kann 80 Seiten Sachverhalte schildern und werde keine Antworten erhalten. Wenn ich statt dessen e=mc² schreibe oder Relativitätstheorie oder auch allgemeine Relativitätstheorie dann wissen selbst manche Kinder und Jugendliche, was gesucht ist und das Internet liefert unzählige Antworten(Treffer).
Bis zur Prägung dieses Begriffes (Hier die Entdeckung eines Naturgesetzes) war es sicher nur extremen Spezialisten vorbehalten, über das Phänomen zu reden und sich auszutauschen und Fragen zu stellen.
Sobald es ein Wort dafür gibt, wird es viel einfacher.
Und so zeigt sich nebenbei, dass es einen nicht zu bestreitenden Nutzen (auch heute) hat, Fachmann zu sein oder zu werden. Fachbegriffe zu kennen, ihre Bedeutung zu kennen und sie richtig nutzen zu können, im Verständnis und in eigenen Aussagen, ist ungeheuer effizient.
Die heute so gern geforderte "Kompetenz" (Schule) ist m.E. das Gegenteil von Fach- oder sogar Allgemeinwissen (wo ich mich frage, ob nicht der eigentliche Sinn des Wortes bereits verloren gegangen ist.) Frei übersetzt bedeutet Kompetenz heute, Du musst es weder verstehen noch brauchst Du Faktenwissen oder Übung, aber du sollst wenigstens eine Idee (schon mal gehört) davon haben(, damit Du es besser googlen kannst oder Achtung, ein passendes Buch dazu lesen kannst.)
Mit anderen Worten, es ist m.E. irreführend oder sogar unfair (von Eltern, Lehrern, Dozenten, Politik), so zu tun, als wäre Lernen und Verstehen (Vokabeln, Fachbegriffe, Gesetzmäßigkeiten, Zusammenhänge) nicht notwendig oder eine Art Luxus, auch und besonders mit dem Verweis auf das Internet, wo man ja "alles findet".
Chatgpt ändert an diesem Problem im Kern nichts, auch wenn die Leistungen dieser Systeme unglaublich sind.
Die Kunst ist und bleibt, die richtigen Fragen zu stellen, das gilt gegenüber und für Mensch und auch Maschine.
Und gute Fragen motivieren einige u.U. auch zu guten Antworten (zumindest Menschen).
/ot
 
Zurück
Oben