Mysql 5.7.27:搜索JSON数组
我试图弄清楚如何搜索表的JSON数组列。我找到了,但我不清楚JSON_搜索是如何工作的 在回答中,人们似乎给JSON_搜索直接数据进行搜索:Mysql 5.7.27:搜索JSON数组,mysql,sql,search,Mysql,Sql,Search,我试图弄清楚如何搜索表的JSON数组列。我找到了,但我不清楚JSON_搜索是如何工作的 在回答中,人们似乎给JSON_搜索直接数据进行搜索: SELECT JSON_SEARCH('["1","2","3","4","5"]', 'one', "2") 但由于我在进行搜索,所以实际上没有数组[“1”、“2”、“3”、“4”、“5”] 我正在创建一个搜索查询,如下所示: SELECT * FROM `server_list` WHERE `server_version` LIKE '%
SELECT JSON_SEARCH('["1","2","3","4","5"]', 'one', "2")
但由于我在进行搜索,所以实际上没有数组[“1”、“2”、“3”、“4”、“5”]
我正在创建一个搜索查询,如下所示:
SELECT * FROM `server_list`
WHERE
`server_version` LIKE '%%'
AND
`server_name` LIKE '%%'
AND
`server_slots` > 1500
AND
`server_slots` < 4000
其中,server\u tags
是我要搜索的列,['1','2','3']
是我要搜索的多个标记
编辑:
我刚刚意识到JSON列只是字符串,这使我能够做到:
SELECT * FROM `lista_server`
`server_tags` LIKE '%value%'
OR `server_tags` LIKE '%value2%'
这个方法有什么问题吗?你所做的绝对没有问题,只是确保你的搜索词是干净的以防止(SQL注入) 你所做的绝对没有错,只要确保你的搜索词是干净的,以防止(SQL注入) 如果要检查是否存在任何标记,可以
或将每个标记的结果合并在一起:
AND (JSON_SEARCH(server_tags, 'one', '1') IS NOT NULL OR
JSON_SEARCH(server_tags, 'one', '2') IS NOT NULL OR
JSON_SEARCH(server_tags, 'one', '3') IS NOT NULL
)
要检查它们是否都存在,只需将和搜索放在一起:
AND (JSON_SEARCH(server_tags, 'one', '1') IS NOT NULL AND
JSON_SEARCH(server_tags, 'one', '2') IS NOT NULL AND
JSON_SEARCH(server_tags, 'one', '3') IS NOT NULL
)
注意:尝试以文本形式搜索可能不起作用,JSON数组中的值可能与测试字符串中的值顺序不同(例如['1','2']
不匹配['2','1']
),或者JSON数组的长度可能不同(例如['1','2']
不匹配['1','2','3']
)等。如果要检查是否存在任何标记,可以或将每个标记的结果合并在一起:
AND (JSON_SEARCH(server_tags, 'one', '1') IS NOT NULL OR
JSON_SEARCH(server_tags, 'one', '2') IS NOT NULL OR
JSON_SEARCH(server_tags, 'one', '3') IS NOT NULL
)
要检查它们是否都存在,只需将和搜索放在一起:
AND (JSON_SEARCH(server_tags, 'one', '1') IS NOT NULL AND
JSON_SEARCH(server_tags, 'one', '2') IS NOT NULL AND
JSON_SEARCH(server_tags, 'one', '3') IS NOT NULL
)
注意:尝试以文本形式搜索可能不起作用,JSON数组中的值可能与测试字符串中的值顺序不同(例如['1','2']
不匹配['2','1']
),或者JSON数组的长度可能不同(例如['1','2']
不匹配['1','2','3']
)等等。此方法的问题:
SELECT * FROM `lista_server`
WHERE `server_tags` LIKE '%value%'
OR `server_tags` LIKE '%value2%'
通配符匹配对值边界一无所知
例如:
INSERT INTO lista_server SET server_tags = '112,456,789';
然后使用您的方法搜索标记“1”:
SELECT * FROM lista_server WHERE server_tags LIKE '%1%'
它很相配!因为112与“%1%”匹配
当您要在列表中搜索单个值时,这是一个关键点
使用JSON和使用逗号分隔的列表一样麻烦
相反,如果要搜索单个值,则需要规范化表。在子表中每行存储一个标记:
INSERT INTO lista_server_tags (lista_server_id, tag)
VALUES (1234, '112'), (1234, '456'), (1234, '789');
然后,您可以将其作为单个值进行搜索:
SELECT l.* FROM lista_server AS l
JOIN lista_server_tags AS t ON (l.id = t.lista_server_id)
WHERE t.tag = '112'
您确信它不会匹配错误。它将只匹配一个值,而不是同时包含搜索字符串的值。您还可以使用索引来帮助加快搜索速度。您可以添加无限数量的标记。以及许多其他好处。此方法的问题:
SELECT * FROM `lista_server`
WHERE `server_tags` LIKE '%value%'
OR `server_tags` LIKE '%value2%'
通配符匹配对值边界一无所知
例如:
INSERT INTO lista_server SET server_tags = '112,456,789';
然后使用您的方法搜索标记“1”:
SELECT * FROM lista_server WHERE server_tags LIKE '%1%'
它很相配!因为112与“%1%”匹配
当您要在列表中搜索单个值时,这是一个关键点
使用JSON和使用逗号分隔的列表一样麻烦
相反,如果要搜索单个值,则需要规范化表。在子表中每行存储一个标记:
INSERT INTO lista_server_tags (lista_server_id, tag)
VALUES (1234, '112'), (1234, '456'), (1234, '789');
然后,您可以将其作为单个值进行搜索:
SELECT l.* FROM lista_server AS l
JOIN lista_server_tags AS t ON (l.id = t.lista_server_id)
WHERE t.tag = '112'
您确信它不会匹配错误。它将只匹配一个值,而不是同时包含搜索字符串的值。您还可以使用索引来帮助加快搜索速度。您可以添加无限数量的标记。以及许多其他好处。您能否详细说明“您还可以使用索引来帮助加快搜索速度。”?对于构建我自己的数据库来说是相当陌生的,所以不完全确定如何做到这一点。您是否有任何资源可以学习如何编制索引?我有:和。您可能还喜欢我的书:。如果您对使用数据库不熟悉,我建议您在了解如何使用规范化数据库之前避免使用JSON数据类型。您能否详细说明“您还可以使用索引来帮助加快搜索速度?”?对于构建我自己的数据库来说是相当陌生的,所以不完全确定如何做到这一点。您是否有任何资源来学习如何编制索引?我有:和。您可能还喜欢我的书:。如果您是使用数据库的新手,我建议您在了解如何使用规范化数据库之前避免使用JSON数据类型。这太棒了,谢谢您的帮助。根本不知道如何使用JSON_搜索@八点不用担心-我很高兴能帮上忙。太棒了,谢谢你的帮助。根本不知道如何使用JSON_搜索@不用担心,我很高兴能帮上忙。