如何优化此 SQL 查询以过滤 longtext/JSON 字段

问题描述

我有一个包含 longtext 类型列的表,该列以 JSON 格式存储营养值。以下是数据外观的示例:

[{"label":"N","value":0.1,"percent":10},{"label":"P",{"label":"K",{"label":"S","value":"","percent":""},{"label":"Ca",{"label":"Mg",{"label":"Zn",{"label":"Mn",{"label":"Cu",{"label":"B",{"label":"Al",{"label":"Fe",{"label":"Na",{"label":"Mo","percent":""}]

目前我正在从 Db 中提取所有记录,然后使用 foreach 遍历每条记录并过滤掉那些没有 N、P 和 K 且具有非零/空字符串百分比的记录价值。

foreach($record as $rec){
                $nutrients = json_decode($rec->nutrients);
                $nutrientTextArray = [];
                foreach($nutrients as $n){
                    if(in_array($n->label,['N','P','K'])){
                        if($n->percent != ''){
                            $nutrientTextArray[] = $n->percent;
                        } else {
                            $nutrientTextArray[] = 0;
                        }
                    } else {
                        if($n->percent != ''){
                            $nutrientTextArray[] = $n->percent . $n->label;
                        }
                    }
                }

但是,遍历每条记录的所有营养素需要很长时间。我尝试在 SQL 查询本身中进行通配符匹配以进行过滤,执行如下操作,

select * from products where nutrients like '%"label":"N"%"label":"P"%"label":"K"%';

但这并没有考虑到非零/空百分比方面。

如何修改此查询以仅选择具有标签 N、P 和 K 的记录,其中每种营养素都具有非零/空字符串百分比值?

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)