选择所有要在JSON键值数组中键入键的行

时间:2019-10-20 19:45:07

标签: mysql sql json database mysql-json

好的,所以我发现您可以保存并选择MySQL中的JSON数据类型。

我试图遵循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 ID的唯一行中会更聪明吗?

我希望有人可以在这里帮助我:)

1 个答案:

答案 0 :(得分:1)

您可以使用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'
)

Demo on MySQL 5.7 DB 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]" |