我们都知道mysql在5.7之后才加入的json相关函数操作,那么在这之前怎么办呢,很多公司还在用老旧的5.6版本,想用json但是特殊情况查询又及其麻烦,这该如何是好?本文简介mysql 5.7之前的json处理办法
我们数据库存储的json数据格式为:
{"imgs_info":"828_1472","place_id":"2143"}
这时候有一个查询,需要查询当place_id不为0时候的情况,就需要用到mysql的substr函数。总体思路为找到place_id的起始位置和长度,取出后面的value,在找到value中第一个”出现的位置座位结束为止,然后substr进行截取
代码如下:
substr(`ext`, locate( '"place_id":"', `ext` ) + length( '"place_id":"' ), locate( '"', `ext`, locate( '"place_id":"', `ext` ) + length( '"place_id":"' ) ) -(locate( '"place_id":"', `ext` ) + length( '"place_id":"' ) ) )
放到实际项目中,可写为以下内容:
$db = self::getDB();
$table = self::getTbCommunityDynamic($duid);
if(!$table){
return [false, []];
}
$limit = self::pagination($page,$page_size);
$sql = "SELECT `id`,`time`,substr( `ext`, locate( '\"place_id\":\"', `ext` ) + length( '\"place_id\":\"' ),locate( '\"', `ext`, locate( '\"place_id\":\"', `ext` ) + length( '\"place_id\":\"' ) ) -(
locate( '\"place_id\":\"', `ext` ) + length( '\"place_id\":\"' ) ) ) AS place_id From {$table} ";
$sql .= "WHERE `user_id`=:user_id AND `is_del`=0 ";
$sql .= " ORDER BY `time` DESC LIMIT {$limit[0]},{$limit[1]} ";
if ($type != 0) {
$sql = " select `id`,`time`,`place_id` from ({$sql}) as alias where alias.place_id >0 GROUP BY alias.place_id ";
}
0 条评论