Select 键在 JSON 键值数组中的所有行

Select all rows where key in JSON key value array

好的,所以我刚刚发现您可以在 MySQL 中的 JSON 数据类型上保存和 select。

我试着按照 user2458995 对与我的类似问题的回答,(不同之处在于我的是一个键,值是一个数组)我复制了他的确切代码,创建了 table,从他的插入 SQL 中输入数据并尝试他的 select,这给了我一个错误。

我在此处修改了 table 以显示在我的示例中如何存储数据的示例。

基本上我有这个设置

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 所有的主题标签,我可以这样做

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

但是我如何 select 像 where in 这样的数据?

我想象的是这样的

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

它确实执行了,但是 returns 没有行。 我还尝试了其他几种建议的方法,但我什么都做不了

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

我认为这将是一个非常巧妙的方法,但是将每个 category/hashtag 存储在具有 FK id 的唯一行中会更聪明吗?

我希望有人能帮助我:)

你可以用 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]" |