我们都知道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 条评论

发表评论

电子邮件地址不会被公开。 必填项已用*标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据