as-n00
Goto Top

MySQL Felder aus anderen Zeilen ergänzen

Hallo,

ich habe eine MySQL db in der ich Werte ergänzen muss die es bei einigen Datensätzen gibt, bei anderen noch nicht.

Also

product_idlanguage_idfilter_1filter_2filter_3
1231carbonversilbertschwarz
1232carbonsilver platedblack
1233carbonoplateadonegro

Jetzt gibt es z Bsp.:

4561carbonversilbertschwarz
4562carbonn/ablack
4563carbonoplateadon/a

oder gar

7891carbonversilbertschwarz
7892n/atn/an/a
7893n/an/an/a

Filterwert der language_id1 ist maßgeblich.
Er soll jetzt die language_id 2-3 durchschauen und nach "n/a" suchen und schauen, ob er dafür in irgend einer anderen product_id schon einen Wert außer "n/a" hat und den dann dort eintagen wo "n/a" steht.
So dass halt alle "n/a" verschwinden.
Geht das überhaupt nur mit MySQL oder muss ich eventuell php zu Hilfe nehmen?

Content-Key: 383730

Url: https://administrator.de/contentid/383730

Printed on: April 23, 2024 at 18:04 o'clock

Member: bloodstix
bloodstix Aug 17, 2018 at 15:56:28 (UTC)
Goto Top
Hallo,

das geht mit ziemlicher Sicherheit auch mit Mysql (ggf. mit einer Stored-Procedure). Aber das wird dann sehr kompliziert.
Einfacher geht das wohl mit php, wenn du php kannst.
Member: ukulele-7
ukulele-7 Aug 20, 2018 at 06:57:39 (UTC)
Goto Top
Das Problem in MySQL (und speziell in MySQL) ist das der Update-Vorgang sich teilweise weigert mit einem Join auf die eigene Tabelle zu arbeiten. Grundsätzlich ist das eigentlich einfach:
UPDATE tabelle
SET tabelle.filter_2 = t.filter_2
FROM tabelle
INNER JOIN tabelle t ON tabelle.filter_1 = t.filter_1
AND tabelle.language_id = t.language_id
AND t.filter_2 <> 'n/a'  
WHERE tabelle.filter_2 = 'n/a'  
Teste das mal und poste ggf. die Fehlermeldung (wie gesagt MySQL spezifisch).
Member: AS-N00
AS-N00 Aug 24, 2018 at 12:17:20 (UTC)
Goto Top
UPDATE products_description
SET products_description.products_filter_1 = t.products_filter_1
FROM products_description
INNER JOIN products_description t ON products_description.products_filter_1 = t.products_filter_1
AND products_description.language_id = t.language_id
AND t.products_filter_1 <> 'n/a'  
WHERE products_description.products_filter_1 = 'n/a'  

Wenn das so richtig ist, dann meckert er aber über:

SQL Fehler (1064):
'FROM products_description INNER JOIN products_description t ON products_descrip'
Member: bloodstix
bloodstix Aug 24, 2018 updated at 15:05:45 (UTC)
Goto Top
Wenn du mit Aliasen arbeitest bzw. mit mehreren Tabellen, tu dir selber und MySQL den gefallen und gib allen einen Alias.

UPDATE products_description p
SET p.products_filter_1 = t.products_filter_1
FROM p INNER JOIN products_description t ON p.products_filter_1 = t.products_filter_1
AND p.language_id = t.language_id
AND t.products_filter_1 <> 'n/a'  
WHERE products_description.products_filter_1 = 'n/a'  

Aber was genau soll dein Query machen?
Er soll p.products_filter_1 mit dem Wert des Felds t.products_filter_1 aktualisieren.
Du joinst jedoch mit "ON p.products_filter_1 = t.products_filter_1".
Was soll sich da deiner Meinung nach verändern?
Oder sollte das "ON p.products_filter_1 <> t.products_filter_1" heißen?

Edit: Hab grad den Post von @ukulele-7 gelesen. Da steht noch "SET p.products_filter_2 = t.products_filter_2".
Member: AS-N00
AS-N00 Aug 24, 2018 at 16:52:28 (UTC)
Goto Top
OK, das wäre dann also:

UPDATE products_description p
SET p.products_filter_2 = t.products_filter_2
FROM p INNER JOIN products_description t ON p.products_filter_1 = t.products_filter_1
AND p.language_id = t.language_id
AND t.products_filter_1 <> 'n/a'  
WHERE products_description.products_filter_1 = 'n/a'  

Da kommt aber immer noch der selbe Fehler.

SQL Fehler (1064)
'FROM p INNER JOIN products_description t ON p.products_filter_1 = t.products_fil'

Ich denke aber die Abfrage geht so eh nicht. Ich muss mir das nochmal anschauen.
Member: ukulele-7
ukulele-7 Aug 29, 2018 at 11:48:01 (UTC)
Goto Top
Ja sry ich konnte dazu nicht mehr schreiben, war ein paar Tage nicht verfügbar.

Das Prinzip funktioniert und ich meine auch in MySQL. Man muss nur leider den Code etwas umbauen damit MySQL das akzeptiert. Hier mal ein simples Beispiel:
https://www.xaprb.com/blog/2006/06/23/how-to-select-from-an-update-targe ...

Ich glaube wenn du das in 2 Subquerys verschachtelst geht das auch, schau mal, ob du das so umgeschrieben bekommst ansonsten versuch ich mich noch mal face-smile