如何在MySQL中搜索JSON数据?

时间:2015-05-23 09:44:55

标签: mysql json mysql-json

我将数据插入到json_encoded的数据库中。现在我想搜索"功能",但我不能。

MySQL查询:

SELECT  `id` ,  `attribs_json` 
FROM  `products` 
WHERE  `attribs_json` REGEXP  '"1":{"value":[^"3"$]'

此查询显示所有带有键" 1"的行。价值是任何不值的东西都是" 3"

我的数据是:

{"feature":{"1":{"value":"["2","3"]"},
            "2":{"value":["1"]},
            "5":{"value":""},
            "3":{"value":["1"]},
            "9":{"value":""},
            "4":{"value":"\u0633\u0627\u062a\u0646"},
            "6":{"value":""},
            "7":{"value":""},
            "8":{"value":""}
           },
"show_counter":"0",
"show_counter_discount":""
}}

9 个答案:

答案 0 :(得分:66)

如果你有 MySQL版本> = 5.7 ,那么你可以试试这个:

onsubmit

输出:

$('input[type="submit"]').click(function(e){
  //validate form
  var condition = validateForm(); //return true or false
  if(condition){
    alert('Form OK!');
  }
  //stop submission
  else{
    alert('Please check and input correct fields!');
    e.preventDefault();
    return false;
  }
});


有关详细信息,请查看MySQL参考手册:
https://dev.mysql.com/doc/refman/5.7/en/json-search-functions.html

答案 1 :(得分:11)

  1. 在数据库中存储JSON违反了第一个普通表单。

    您可以做的最好的事情是将功能标准化并存储在另一个表中。然后,您将能够使用连接更好看和执行查询。 您的JSON甚至类似于表格。

  2. Mysql 5.7具有内置的JSON功能:
    http://mysqlserverteam.com/mysql-5-7-lab-release-json-functions-part-2-querying-json-data/

  3. 正确的模式是:

    WHERE  `attribs_json` REGEXP '"1":{"value":[^}]*"3"[^}]*}'
    

    [^}]将匹配除}

  4. 之外的任何字符

答案 2 :(得分:10)

如果您使用的是MySQL最新版本可能有助于满足您的要求。

select * from products where attribs_json->"$.feature.value[*]" in (1,3)

答案 3 :(得分:6)

我使用此查询

SELECT id FROM table_name WHERE field_name REGEXP '"key_name":"([^"])key_word([^"])"';
or
SELECT id FROM table_name WHERE field_name RLIKE '"key_name":"[[:<:]]key_word[[:>:]]"';

我用它来搜索部分值的第一个查询。第二个查询我用它来搜索确切的单词。

答案 4 :(得分:2)

喜欢就好。

SELECT * FROM `products` 
    WHERE JSON_UNQUOTE(JSON_EXTRACT(`attribs_json`, '$.value')) LIKE '%X%'

答案 5 :(得分:1)

对于Mysql8->

查询:

SELECT properties, properties->"$.price" FROM book where isbn='978-9730228236' and  JSON_EXTRACT(properties, "$.price") > 400;

数据:

mysql> select * from book\G;
*************************** 1. row ***************************
id: 1
isbn: 978-9730228236
properties: {"price": 44.99, "title": "High-Performance Java Persistence", "author": "Vlad Mihalcea", "publisher": "Amazon"}
1 row in set (0.00 sec)

答案 6 :(得分:1)

如果 MySQL 版本 <5.7

SELECT fields
FROM table
WHERE field_json LIKE '%"key":"70"%';

// 70 = 值

答案 7 :(得分:-1)

对于MySQL全部(和5.7)

SELECT LOWER(TRIM(BOTH 0x22 FROM TRIM(BOTH 0x20 FROM SUBSTRING(SUBSTRING(json_filed,LOCATE('\"ArrayItem\"',json_filed)+LENGTH('\"ArrayItem\"'),LOCATE(0x2C,SUBSTRING(json_filed,LOCATE('\"ArrayItem\"',json_filed)+LENGTH('\"ArrayItem\"')+1,LENGTH(json_filed)))),LOCATE(0x22,SUBSTRING(json_filed,LOCATE('\"ArrayItem\"',json_filed)+LENGTH('\"ArrayItem\"'),LOCATE(0x2C,SUBSTRING(json_filed,LOCATE('\"ArrayItem\"',json_filed)+LENGTH('\"ArrayItem\"')+1,LENGTH(json_filed))))),LENGTH(json_filed))))) AS result FROM `table`;

答案 8 :(得分:-1)

我认为...

搜索部分值:

SELECT id FROM table_name WHERE field_name REGEXP '"key_name":"([^"])*key_word([^"])*"';

搜索准确的单词:

SELECT id FROM table_name WHERE field_name RLIKE '"key_name":"[[:<:]]key_word[[:>:]]"';