我在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
做什么,以便检查变量条形码,并获得相应的名称,姓氏等?
答案 0 :(得分: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'%“条形码”%'使用包含条形码值的字段extraData过滤行 :条形码表示要匹配的值,TRIM是为了摆脱额外的双引号,嵌套的SUBSTRING_INDEX搜索:
从“条形码”第一场比赛结束时开始的文字:'最多 下一个匹配','(如果有更多的键/值)直到下一个 匹配'}'(如果它是该级别的最后一个键/值)
请记住,如果您发现某个键/ val始终存在于每一行并且在任何地方都可以访问,那么您应该考虑在表/数据模型中添加一个额外的字段并从中创建一个索引(即姓名,姓氏。
检索到的值必须“始终”解码。
"Einstürzende Neubauten" is stored as "Einst\u00fcrzende Neubauten"
进行搜索并比较数字是“ok”,就像在示例中一样(修剪双引号有时不是必要的,就好像你json_encode一个整数var它将被存储为“数字”:99)。但是将根据区域“1,5”/“1.5”
搜索和比较字符串更棘手:你必须“jsonencode”值才能匹配
"https://www.google.com" is stored as "https:\/\/www.google.com"
检查data normalization技能。
检查optimization技能
使用an online tool查看您的数据将如何编码