SQL 處理序列化的方法

表 user 中字段area_data 存放該用戶的省市區信息,序列戶後字符串格式如下:


a:2:{i:1;s:9:"安徽省";i:46;s:9:"蕪湖市";}
a:3:{i:14;s:9:"吉林省";i:198;s:24:"延邊朝鮮族自治州";i:3039;s:9:"延吉市";}
a:2:{i:18;s:18:"內蒙古自治區";i:238;s:15:"巴彥淖爾市";}
a:3:{i:25;s:9:"四川省";i:318;s:9:"雅安市";}

反序列化後是一個數組,array(9=>'安徽省',46=>'蕪湖市'),其中key值是區域表id,value是區域名稱。


若現在知道某省id=25查找該省下有多少用戶,可以使用下面的SQL

-- 獲取某省下市級的代理商
SELECT * FROM user  WHERE substring(area_data,8,position(';' IN area_data)-8)+0=25


原理是這個字符串的前面7位的固定的長度,在第8位的時候是該省級的id,通過substring截取到截至第一個;號的位置,再通過+0把字符串轉化爲數字實現,


另外還可以通過正則實現,相對更簡單一些:

SELECT * FROM user WHERE area_data REGEXP 'i:25;';

因爲i:25;這樣的字符串代表了區域表的主鍵id,所以永遠不會查到同一條記錄相同的串。


當然如果參數是區域 的名稱也完全可以用LIKE,如;

SELECT * FROM c_qd_agent WHERE area_data LIKE '%安徽省%';

SELECT * FROM c_qd_agent WHERE area_data LIKE '%i:25;%';

但沒有測試大數據的時候執行效率。。。。。





發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章