118080

MySQL automisiert anpassen

Moin Leute

Sorry, das Unterforum Entwicklung pass nicht so ganz, aber anderen Datenbank Tags habe ich nicht gefunden...

Ich hab hier eine MySQL Datenbank und würde gerne etwas automatisieren. Ich bin mir nicht sicher ob sich das mit einer MySQL Query lösen lässt, aber ich denke es mal. Leider brauche ich diesen Syntax so gut wie nie und kenne darum eigentlich nur die Grundbefehle...
Die relevanten Tabellen und Beziehungen sehen so aus:
mysql

Wenn möchte ich für jeden Eintrag in contact.last_name schauen ob der Wert von contact.last_name irgendwo in call.description gefunden wird.
(Bsp.: contact.last_name ist der erste Wert "Peter" wenn nun irgendwo "Peter" in call.description steht dann folgt der zweite Teil)

Überall wo jetzt eine Übereinstimmung gefunden wird soll nun beim entsprechenden Eintrag in der call Tabelle die ID ausgelesen werden, suche diese ID in call_contact und trage dort bei contact_id den Wert Wert von ID des aktuellen EIntrags in contact ein..


Beispiel:

contact
id last_name
12 Peter
24 Max

call
id description
23 Peter ist nett.
94 Ich mag sie nicht.


Bei diesen Datensatz würde das Ergbenis so aussehen:

call_contact
id call_id contact_id
39 23 12

Ich hoffe es ist einigermassen verständlich, da diese Problem sehr wichtig ist.

Bitte helft mir face-confused
Auf Facebook teilen
Auf X (Twitter) teilen
Auf Reddit teilen
Auf Linkedin teilen

Content-ID: 299371

Url: https://administrator.de/forum/mysql-automisiert-anpassen-299371.html

Ausgedruckt am: 17.05.2025 um 09:05 Uhr

ukulele-7
Lösung ukulele-7 17.03.2016 aktualisiert um 16:14:57 Uhr
Goto Top
Ich bin mir nicht sicher ob die Reihenfolge stimmt und ob es unter MySQL läuft:
UPDATE	call_contact
SET		call_contact.contact_id = contact.id
FROM	call_contact
INNER JOIN contact
ON		call_contact.call_id = contact.id
INNER JOIN call
ON		contact.last_name LIKE '%' + call.description + '%'  
Problematisch wird es sobald es mehr als einen Peter in contacts gibt...
118080
118080 18.03.2016 um 08:14:57 Uhr
Goto Top
Wow, das ist ja mal ein Query..
Ach jetzt wo du es sagst, es wird ganz sichere mehrere Peter haben :/
Allerdings ist jeder Eintrag in contact mit einem Eintrag aus account verknüpft und ein Eintrag aus call ist auch mit einem Eintrag aus account Verknüpft, dabei müss der verknüpfte Eintrag in account identisch sein..
Werde hie nachher noch die Beziehungen sowie die Beispieltabellen anpassen
118080
118080 18.03.2016 aktualisiert um 09:13:56 Uhr
Goto Top
Habe jetzt die fehlenden Beziehungen rot eingezeichnet..
mysql
Jetzt müsste man eigentlich nur noch überprüfen ob der Wert von account_id in allen Tabellen übereinstimmt..
Wärst du so nett und würdest mir das noch anpassen? Bitte? Ich krieg das selber nicht hin, da ich sonst einfach nicht mit Datenbanken im Backend arbeite..
ukulele-7
Lösung ukulele-7 18.03.2016 um 10:09:48 Uhr
Goto Top
Öhm das müsste ich mir mal in aller Ruhe angucken aber das Hauptproblem ist vermutlich identisch. Du hast einen Fließtext in dem ein Name steht (oder vieleicht auch mehrere?) und ich joine alle Namen mit LIKE auf diesen Text. Sobald da zwei Namen drinne stehen oder der Name nicht eindeutig ist (im Text steht ja auch keine ID) gibt es mehrere Treffer und deine Zielspalte wird mit mehreren Werten aktualisiert.

Möglicherweise ist MySQL das egal und es aktualisiert die Spalte mehrfach. Dann hast du einen beliebigen Treffer da drinne stehen.

Möglicherweise kriegst du aber auch eine Fehlermeldung, MSSQL würde das anmeckern. Dann musst du erst prüfen und bei mehreren Treffern einen bestimmten wählen. Das geht, ist aber nicht ganz einfach und ich glaube mit MySQL nicht zu lösen (mit MSSQL habe ich das schon gemacht).
118080
118080 18.03.2016 aktualisiert um 13:33:04 Uhr
Goto Top
Ja da wäre ich dir dankbar..

Das sehe ich nicht so als Problem..
call.description ist ein Fliesstext: Ja
in diesem Fliesstext sind mehrere Namen enthalten: Nein, in 95% der Fälle nicht.. Bei den restlichen 5% ist es egal, da soll am besten einfach der erste Name der in call.description vorkommt genommen werden oder im Notfall halt der letze Name in call.description
Zum Thema wenn ein Name nicht unique ist: Das wird ja verhindert durch das was ich zuletzt mit den neuen Beziehungen nachgetragt habe (account_id).
Dann wäre dass einzige Problem wieder wenn es zwei Peter gäbe, bei denen die Account ID gleich ist.. das trifft bei unserem System auf höchstens 0.1% zu, das wären bei 20'000 Einträgen in der Tabelle "call" 20 Einträge bei denen das zutrifft.. Das ist pinatz wenn da etwas falsches Eingetragen wird von dem Query und wird von den entsprechenden Mitarbeitern manuell angepasst..
ukulele-7
Lösung ukulele-7 18.03.2016 um 14:38:20 Uhr
Goto Top
Also mein erstes Statement war nicht ganz richtig:
SELECT	call_contact.contact_id,contact_id
FROM	call_contact
INNER JOIN [call]
ON		call_contact.call_id = [call].id
INNER JOIN contact
ON		[call].[description] LIKE '%' + contact.last_name + '%'  
Wenn man das jetzt mit account_id erweitert müsste das hier richtig sein:
SELECT	call_contact.contact_id,contact_id
FROM	call_contact
INNER JOIN [call]
ON		call_contact.call_id = [call].id
INNER JOIN contact
ON		[call].account_id = contact.account_id
AND		[call].[description] LIKE '%' + contact.last_name + '%'  
Ich bin mir beim Sinn nicht ganz sicher, du kannst beide Statements testen, es sind ja erstmal nur Selects.

Wenn man das jetzt zu einem UPDATE macht:
UPDATE	call_contact
SET		call_contact.contact_id = contact_id
FROM	call_contact
INNER JOIN [call]
ON		call_contact.call_id = [call].id
INNER JOIN contact
ON		[call].account_id = contact.account_id
AND		[call].[description] LIKE '%' + contact.last_name + '%'  
könnte das eine Fehlermeldung provozieren sobald er mehr als einen Treffer hat. Das musst du unter MySQL bitte mal testen, das kann ich nicht genau sagen. Mit:
SELECT	call_contact.contact_id
FROM	call_contact
INNER JOIN [call]
ON		call_contact.call_id = [call].id
INNER JOIN contact
ON		[call].account_id = contact.account_id
AND		[call].[description] LIKE '%' + contact.last_name + '%'  
GROUP BY call_contact.contact_id
HAVING count(*) > 1
Bekommst du in jedem Fall Einträge mit mehr als einem Treffer angezeigt.
118080
118080 18.03.2016 um 14:59:07 Uhr
Goto Top
Danke erstmal face-smile Ich werde es logischweise erst an einem Replikat der produktiven Datenbank testen und mich dann nochmals melden.
Evtl. hilft es dir beim Verständnis: Es handelt sich um die Datenbank unseres CRM, dabei entspricht "account" den Firmen, "call" Anrufen und "contact" den Personen in den Firmen, dass die anderen Tabellen dabei diese 3 zusammenhalten ist ja selbsterklärend denke ich. Ich hoffe ich konnte dir hiermit helfen face-smile
118080
118080 18.03.2016 aktualisiert um 16:21:16 Uhr
Goto Top
Zitat von @ukulele-7:
Wenn man das jetzt mit account_id erweitert müsste das hier richtig sein:
SELECT	call_contact.contact_id,contact_id
> FROM	call_contact
> INNER JOIN [call]
> ON		call_contact.call_id = [call].id
> INNER JOIN contact
> ON		[call].account_id = contact.account_id
> AND		[call].[description] LIKE '%' + contact.last_name + '%'  

ich krieg die folgende Fehlernmeldung:
fehler mysql
hab die eckigen Klammern mal entfernt, aber dann kamen schon neue Fehler... face-confused
Hba dann mal an den Stellen wo dies evtl. nötig wäre den Datenbanknamen noch eingefügt, klappt trotzdem nicht..
ukulele-7
Lösung ukulele-7 21.03.2016 um 08:23:09 Uhr
Goto Top
Ja die eckigen Klammern nutzt MSSQL, probier es mal mit ` vor und hinter Tabellen und Spaltennamen. Ich weiß nicht, ob MySQL call und so als Befehle erkennt wenn sie nicht vernünftig als Spaltennamen gekennzeichnet sind.

Eventuell kommt MySQL mit der UPDATE Syntax generell nicht klar, dann musst du einen Cursor oder andere Alternativen nutzen.
118080
118080 21.03.2016 aktualisiert um 08:32:44 Uhr
Goto Top
Habe mir hier jetzt mal eine übers Wochenende eine VB.Net Application geschrieben welche genau das macht.. Hat eigentlich gut geklappt.
Nun möchte ich das Ergebnis kontrollieren und brauche dazu alle Einträge aus der Tabelle "call" bei welchen der Wert von "id" nicht in der Tabelle "call_contact" in der Spalte "call_id" vorkommt.. Wollte das mal so Probieren, was aber wie gedacht nicht funktioniert hat:
SELECT * FROM `call` WHERE call_contact.call_id != `call`.id


Zitat von @ukulele-7:
Ja die eckigen Klammern nutzt MSSQL, probier es mal mit ` vor und hinter Tabellen und Spaltennamen. Ich weiß nicht, ob MySQL call und so als Befehle erkennt wenn sie nicht vernünftig als Spaltennamen gekennzeichnet sind.
Ja, MySQL erkennt es so als Befehl, aber auch ` haben nichts gebracht..
ukulele-7
Lösung ukulele-7 21.03.2016 um 08:47:50 Uhr
Goto Top
In deinem Prüf-Select beziehst du dich im WHERE Teil auf eine Tabelle die du vorher nicht gejoint hast.
118080
118080 24.03.2016 um 13:40:50 Uhr
Goto Top
Nicht sehr intelligent, sorry ^^ Habs nachher auch noch gemerkt und den Query auch sonst noch verändert..
Funktioniert nun soweit ich das sehe.. Danke dir! face-smile