2016-03-30 5 views
4

Ich habe derzeit eine MySQL-Tabelle, die eine Spalte zum Speichern von Kategorie-IDs enthält. Diese IDs werden in einer JSON-Zeichenfolge gespeichert. Ich suche nach der effizientesten Methode, um diese JSON-Zeichenfolge für eine bestimmte ID abzufragen.Durchsuchen einer MySQL-Spalte mit einer JSON-Zeichenfolge für einen bestimmten Wert

Zum Beispiel:

Tabelle:Beiträge

Field:Katzen

Hier sind einige Beispielwerte für die JSON-String in den Katzen Spalte :


[111, 123, 456]

[123, 345, 999]

[555, 777, 888]

Lassen Sie uns sagen, dass ich für alle Zeilen abfragen möchten, die enthalten Die ID: "123" innerhalb der JSON-Zeichenfolge. Ich weiß, dass ich dies mit einer Reihe von LIKE Vergleichen erreichen kann, aber ich bin mir sicher, dass es eine effizientere Möglichkeit gibt, die JSON-Strings abzufragen. Alle anderen Ideen würden sehr geschätzt werden.

Danke!

+0

gibt es keinen effizienten Weg, um diese Art der Suche zu tun. Deshalb ist das Speichern Ihrer Daten auf diese Weise eine unglaublich schlechte Idee. – Barmar

Antwort

2

Wenn Sie wirklich bestimmte Werte in Ihrer JSON-Zeichenfolge abfragen müssen, ist es viel besser, die einzelnen Werte in der Datenbank zu speichern und zu speichern. Im obigen Beispiel könnten Sie einfach eine Feldtabelle erstellen, die sich mit der Tabelle posts verbindet. Dann erhalten Sie mit einer einfachen Join-Anweisung alle richtigen Werte.

2

Es gibt eine starke Diskussion über JSON Werte speichern (Storing Data in MySQL as JSON), aber man konnte nativen MySQL-Funktionen für diese verwenden:

Mysql offiziellen doc: https://dev.mysql.com/doc/refman/5.7/en/json-functions.html

In den

Funktionen, die Suche JSON-Werte

gibt es:

mysql> SET @j = '{"a": 1, "b": 2, "c": {"d": 4}}'; 
mysql> SET @j2 = '1'; 
mysql> SELECT JSON_CONTAINS(@j, @j2, '$.a'); 

oder mit REGEX so etwas wie:

SELECT * FROM posts where cats REGEXP '"id":"[[:<:]]123[[:>:]]"'; 

oder mit:

extract_json_value ( json_text TEXT charset utf8 XPath TEXT charset utf8 ) RETURNS utf8 TEXT CHARSET

hier ein Guter Beitrag zum Umgang mit JSON auf mysql: http://rpbouman.blogspot.com.es/2015/11/mysql-few-observations-on-json-type.html

Hoffe es hilft!

4

Katzen müssen enthält: {"ids": [2,4,6,7]}

WHERE JSON_CONTAINS(posts.cats->"$.ids", '[2]');

Verwandte Themen