3

我在 mysql 列 ( extraData) 中存储了一些额外的表单数据作为 json。

示例数据

{"1":{"name":"sadsdaf ","surname":"sdafa","occupation":"sdaas","email":"dsasdaf@asdf.nl","barcode":"052355491"},"2":{"name":"sadafd","surname":"sdafa","occupation":"sddaf","email":"sda@daf.nl","barcode":"052355492"}}

我想做一个搜索查询,它还搜索存储在 json 编码字段中的条形码?所以不仅如此

$sql = "SELECT name FROM visitors WHERE barcode = '".$barcode."'";

但是也

 $sql = "SELECT name FROM visitors WHERE barcode = '".$barcode."' OR extraData = '".$barcode."'";

我需要做什么才能extraData检查可变条形码并获得相应的姓名、姓氏等?

4

1 回答 1

3
SELECT TRIM(BOTH '"' FROM SUBSTRING_INDEX(SUBSTRING_INDEX(SUBSTRING_INDEX(V.extraData,'"name":', -1),',',1),'}',1) 
 FROM visitors V
 WHERE  V.extraData LIKE '%"barcode"%'
   AND :barcode = TRIM(BOTH '"' FROM SUBSTRING_INDEX(SUBSTRING_INDEX(SUBSTRING_INDEX(V.extraData,'"barcode":', -1),',',1),'}',1);

LIKE '%"barcode"%'过滤带有包含条形码值的字段 extraData 的行: barcode表示要匹配的值,TRIM 是去掉多余的双引号,嵌套的 SUBSTRING_INDEX 搜索:

从 '"barcode":' 的第一个匹配结尾开始的文本直到 ',' 的下一个匹配(如果有更多键/值)直到 '}' 的下一个匹配(如果它是最后一个键/该级别的值)

  1. 请记住,如果您发现某个键/值始终存在于每一行中并且在任何地方都可以访问,您应该考虑向表/数据模型添加一个额外的字段并从中创建一个索引(即姓名、姓氏) .

  2. 检索到的值必须“总是”解码。

    "Einstürzende Neubauten" is stored as "Einst\u00fcrzende Neubauten"
    
  3. 进行搜索和比较数字是“好的”,就像在示例中一样(有时不需要修剪双引号,就好像你 json_encode 一个整数 var 它将被存储为 "number":99 )。但小数的存储取决于语言环境“1,5”/“1.5”

  4. 搜索和比较字符串更棘手:您必须“jsonencode”要匹配的值

    "https://www.google.com" is stored as "https:\/\/www.google.com"
    
  5. 检查您的数据规范化技能。

  6. 检查您的优化技能

  7. 使用在线工具查看您的数据将如何编码

于 2013-07-30T19:00:48.753 回答