Daten in MySQL in geschweiften Klammern verschachtelt

AokoYoshida

Neuer Benutzer
Beiträge
3
Liebe Community,

ich bin wirklich verzweifelt und stolpere seit Monaten immer wieder über dieses Problem. Ich sage gleich dazu, ich bin nur Webdesigner und habe den Umgang mit MySQL nicht gelernt. Was ich kann, habe ich mir selbst erarbeitet, aber zu meinem großen Problem konnte ich einfach bis heute nichts finden.

Wir führen einen Webshop über Joomla mit Virtuemart und mittels eines Plug-Ins werden benutzerdefinierte Felder zu den Artikeln hinzugefügt, in unserem Fall die Produktlänge (es geht um Meterware). Die Werte in diesem Feld werden in der Datenbank als mediumtext gespeichert, in folgendem Format: {"53":{"1034":{"comment":"0.5"}}}, wobei die ersten beiden Zahlen für die IDs der benutzerdefinierten Felder stehen und innerhalb der tiefsten Klammer steht dann, wenn vorhanden, die vom Kunden gewünschte Produktlänge oder bei manchen Artikeln einfach nur eine Farbe oder andere Kommentare. Mein Problem ist, dass ich nicht weiß, wie ich den Wert von "comment" in meine ausgeben kann. Ich dachte zunächst mit json_decode arbeiten, aber hierfür müssten die Werde durch Kommata getrennt sein und nicht immer tiefer in Klammern verschachtelt.

(Ich brauche diese Werte sehr dringend. Die Warenwirtschaft ist eine Katastrophe, da die Länge nur eine Eigenschaft ist und keinen Einfluss auf die Stückzahlen nimmt. Wir ziehen jetzt zwar den gesamten Webshop auf ein professionelleres CMS um, aber bis dahin müssen wir irgendwie Inventur betreiben.)

Ich hoffe, ihr könnt mir helfen. Danke!
 
Werbung:
Das sind in der Tat JSON-Daten - die MySQL, weil es das nicht besser kann, als Text speichert. Da hast Du wenig bis gar keine Chance, innerhalb von MySQL an die Daten ranzukommen, das wirst Du außerhalb mit PHP oder so lösen müssen.

Angenommen, Du kennt den Pfad zu dem, was Du wissen willst (hier '53' -> '1034' ->> 'comment') und das wäre PostgreSQL und Du hättest das in einer Tabelle wie hier:

Code:
test=*# select * from json_demo ;
 id |  json_data   
----+--------------------------------------
  1 | {"53": {"1034": {"comment": "0.5"}}}
(1 Zeile)

dann wäre das abfragbar via:

Code:
test=*# select json_data -> '53' -> '1034' ->> 'comment' as comment from json_demo ;
 comment
---------
 0.5
(1 Zeile)

Es gibt weitere Funktionen, um z.B. die Keys eines solchen JSON-Strings zu ermitteln etc. Aber, again, MySQL kann das alles nicht.
 
Vielen Dank, damit hast du mir schon sehr geholfen! Zum Glück muss das ganze sowieso in PHP verarbeitet und ausgegeben werden. Aber der Pfad ist leider nicht immer der selbe. Es gibt eine Vielzahl an Kombinationen von IDs. Ich versuche jetzt, eine akzeptable Schleifenabfrage zu schreiben. Am einfachsten wäre es für mich, wenn ich einfach den dritten Wert innerhalb des verschachtelten Arrays auslesen könnte, aber nach dem, was ich jetzt so gelesen habe, wird das wahrscheinlich nicht möglich sein.
 
Also eine saubere Lösung in SQL ist mega aufwendig und unperformant. Aber wenn es hilft kannst du dir z.B. den erst besten Wert aus Comment fischen und damit vielleicht schonmal einen Großteil abarbeiten:
Code:
DECLARE   @i VARCHAR(100)
SET     @i = '{"53":{"1034":{"comment":"0.5"}}}'

SELECT   left(right(@i,len(@i)-patindex('%{"comment":"%',@i)-11),charindex('"',right(@i,len(@i)-patindex('%{"comment":"%',@i)-11))-1)
Das ist MSSQL, sollte aber in MySQL ähnlich gehen. Den Wert schreibt man sich dann erstmal in eine Hilfsspalte oder so.
 
Vielen Dank, das werde ich auf jeden Fall speichern!
Ich habe heute Nacht noch für meine Zwecke eine einfach Lösung in PHP gefunden. Jetzt kann es endlich an die Berechnungen gehen.
Noch einmal Danke für die schnelle, kompetente Hilfe! :)
 
Werbung:
Zurück
Oben