好的,所以我发现您可以保存并选择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的唯一行中会更聪明吗?
我希望有人可以在这里帮助我:)
答案 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'
)
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]" |