Выберите все строки, где ключ в массиве значений ключей JSON - PullRequest
1 голос
/ 20 октября 2019

Хорошо, я только что узнал, что вы можете сохранить и выбрать тип данных JSON в MySQL.

Я пытался ответить user2458995 на тот же вопрос, что и мой, (Разница моя с ключом, а значение - массив). Я скопировал его точный код, создал таблицу, вставил данные из его вставки SQL и попробовал его выбор, который дал мне ошибку.

Я изменил таблицу здесь, чтобы показать пример того, как данные будут храниться в моем примере.

В основном у меня есть эта настройка

CREATE TABLE my_table (id INT, data JSON);

INSERT INTO my_table VALUES (1, '{"hashtags": ["html", "php", "javascript"], "categories": [2,5,6]}'), (2, '{"hashtags": ["css", "jquery", "html"], "categories": [2,5,6]}')

Если я хочу выбрать все хэштегиЯ могу сделать это следующим образом

SELECT data->>"$.hashtags" FROM my_table

Но как мне выбрать данные, например, где?

Я представлял себе что-то вроде этого

SELECT * FROM `my_table` WHERE 'html' IN (data->>"$.hashtags")

Это действительно выполняется,но он не возвращает строк. Я также попробовал несколько других предложенных способов, но я не могу заставить что-либо работать

SELECT * FROM `my_table` WHERE JSON_CONTAINS('html', '$.hashtags')

Я думал, что это будет действительно аккуратный подход, но будет ли разумнее просто хранить каждую категорию / хэштег в уникальномгрести с идентификатором FK?

Надеюсь, кто-нибудь может мне помочь:)

1 Ответ

1 голос
/ 20 октября 2019

Вы можете указать это с помощью JSON_SEARCH(), доступного в MySQL 5.7:

select *
from `my_table` 
where json_search(data, 'one', 'html', null, '$.hashtags[*]') is not null

Объяснение:

json_search(
    data,            -- json document to search
    'one',           -- the search terminates after the first match 
    'html',          -- search string argument
    null,            -- escape character: none
    '$.hashtags[*]'  -- path to search: the json array under attribyte 'hashtag'
)

Демона MySQL 5.7 БД Fiddle :

select 
    t.*,
    json_search(data, 'one', 'html', null, '$.hashtags[*]') matched_path
from `my_table` t 
where json_search(data, 'one', 'html', null, '$.hashtags[*]') is not null;

| id  | data                                                                 | matched_path    |
| --- | -------------------------------------------------------------------- | --------------- |
| 1   | {"hashtags": ["html", "php", "javascript"], "categories": [2, 5, 6]} | "$.hashtags[0]" |
| 2   | {"hashtags": ["css", "jquery", "html"], "categories": [2, 5, 6]}     | "$.hashtags[2]" |
...