2015-03-19 11 views
5

Mam tabelę w MySQL, który ma kolumnę, która przechowuje obiekty JSON. Jak mogę łatwo uruchamiać zapytania, które mogą zawierać niektóre pola JSON w klauzuli WHERE?Jak pisać zapytania w MySQL, które mogą parsować dane JSON w kolumnie?

EX: Z tabeli o nazwie articles

+----+---------+--------------------------------------------------------------------------------------------------+ 
| id | user_id | json_data                      | 
+----+---------+--------------------------------------------------------------------------------------------------+ 
| 1 |  1 | {"url":"https://www.cpubenchmark.net/","title": "CPU Benchmarks"}        | 
| 2 |  1 | {"url":"http://www.ebay.com/sch/CPUs-Processors-/164/i.html","title": "Computer and Processors"} | 
| 3 |  2 | {"url":"https://www.youtube.com/watch?v=tntOCGkgt98","title": "Funny Cats Compilation"   | 
+----+---------+--------------------------------------------------------------------------------------------------+ 

Chcę być w stanie napisać coś takiego:

SELECT user_id, json_data FROM articles WHERE json_data.title LIKE "%CPU%" 

To powinno powrócić tylko pierwszy wiersz.

+0

To może pomóc http://stackoverflow.com/questions/26670022/mysql-udf-json-extract- in-where-klauzula-jak-poprawić-wydajność –

+0

Użyj MySQL 'common_schema' –

Odpowiedz

0

Spróbuj następującą kwerendę i sprawdzić, czy pasuje do Twoich potrzeb:

SELECT user_id, json_data 
FROM articles 
WHERE common_schema.extract_json_value(json_data,'title') 
LIKE "%CPU%" 

ta będzie działać tylko na MySQL wersji 5.1 lub nowszej.

+0

Używamy> = 5.5. Otrzymuję: FUNKCJA common_schema.extract_json_value nie istnieje. Myślę, że muszę użyć tego, co muszę zainstalować: https://code.google.com/p/common-schema/ - Właściwie zacząłem szukać innej wtyczki. –

1

Skończyło się rozwiązywanie w ten sposób: https://github.com/ChrisCinelli/mysql_json z UDF. Wyjaśniłem, jak go skompilować i zainstalować w pliku README. To działa na mnie na Ubuntu 12.04.5 na gcc version 4.6.3 z MySQL 5.5

będzie można uruchomić:

SELECT json_get('{"a":1}', 'a')  => 1 
SELECT json_get('{"a":1}', 'b')  => NULL 
SELECT json_get('[1,2,3]', 2)   => 3 
SELECT json_get('{"a":[2]}', 'a', 0) => 2 

#Also: 

SELECT json_get('{"a":{"b":2}}', 'a') => object 
SELECT json_get('{"a":[1,2,3]}', 'a') => array 

# Verify if it is a valid JSON: 

SELECT ISNULL(json_get('{"a":1}')); => 0 # Valid 
SELECT ISNULL(json_get('{"a":1')); => 1 # Invalid 

# Create an example table: 

CREATE TABLE `message` (
    `id` int(11) NOT NULL AUTO_INCREMENT, 
    `data` text, 
    PRIMARY KEY (`id`) 
); 
INSERT INTO message (id,data) VALUES(1,'{"from":"chris","title":"Awesome Article","body":"Lorem ipsum dolor sit amet, consectetur adipiscing elit."}'); 
INSERT INTO message (id,data) VALUES(2,'{"from":"loren","title":"Another Article","body":"Lorem ipsum dolor sit amet, consectetur adipiscing elit."}'); 
INSERT INTO message (id,data) VALUES(3,'{"from":"jason","title":"How to run a query","body":"Lorem ipsum dolor sit amet, consectetur adipiscing elit."}'); 

# Run queries on JSON values: 

SELECT json_get(data,'title') FROM message WHERE id=2; 
SELECT id,data FROM message WHERE json_get(data,'from')='chris'; 
SELECT id,data FROM message WHERE json_get(data,'title') LIKE '%Article%'; 
+0

Ktoś wie, czy Mariahdb obsługuje to? – Praesagus

+0

Mam 5.5.14 i FUNCTION json_get nie istnieje –

Powiązane problemy