Mysql 5.7.27:搜索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 '%

我试图弄清楚如何搜索表的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 '%%'
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_搜索@不用担心,我很高兴能帮上忙。