簡體   English   中英

如何優化此 SQL 查詢以過濾長文本/JSON 字段

[英]How to optimize this SQL query to filter on a longtext/JSON field

我有一個表格,其中有一列長文本類型,它以longtext格式存儲營養值。 以下是數據的示例:

[{"label":"N","value":0.1,"percent":10},{"label":"P","value":0.1,"percent":10},{"label":"K","value":0.1,"percent":10},{"label":"S","value":"","percent":""},{"label":"Ca","value":"","percent":""},{"label":"Mg","value":"","percent":""},{"label":"Zn","value":"","percent":""},{"label":"Mn","value":"","percent":""},{"label":"Cu","value":"","percent":""},{"label":"B","value":"","percent":""},{"label":"Al","value":"","percent":""},{"label":"Fe","value":"","percent":""},{"label":"Na","value":"","percent":""},{"label":"Mo","value":"","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 的 select 記錄,其中每種營養素都具有非零/空字符串百分比值?

規范化你的數據庫
好吧,這不是您問題的真正答案,而是一種方法。
由於您的查詢相當復雜,您可以將 json 數據拆分為適當的數據庫數據(對其進行規范化),例如每個字段都在 db 中反映。 然后,您可以 go 進行常規查詢,並將這些表連接在一起。

哈克一號
除此之外,更“hacky”且可能不太可靠的方法:更改您的 JSON 數據,例如“percent”直接在字符串中的“label”后面。 比您也可以在一個長通配符術語中查詢那個。 但請注意:然后,您將依賴數據結構來獲取結果,這是我一般不會建議的。

最好的,彎曲的

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM