mysql中 多选项的json存储及查询

这个表单是网站的一些调查问卷中的多选项,如果查询的话,怎么做最简易?

首先是将大类与小类拆开:

CREATE TABLE `t_base_social_ability` (
   `id` char(19) NOT NULL COMMENT '主键id',
   `ability_type` varchar(2) NOT NULL DEFAULT '' COMMENT '能力类型字典项',
   `ability_detail` json COMMENT '能力详情',
   PRIMARY KEY (`id`) USING BTREE
 ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='特长表'

 插入测试数据,查询

 查询数据,同时包含 3,13的数据:

SELECT * FROM t_base_social_ability 
WHERE json_contains(ability_detail,json_array('3','13'));

查询数据,3 或13的数据
 

SELECT * FROM t_base_social_ability 
WHERE json_contains(json_array('3','13'),ability_detail) AND JSON_LENGTH(ability_detail)>0;

mysql中json字段的用法:

@TableName(value = "t_base_social_ability",autoResultMap = true)
@Data
public class SocialAbility{
@TableField(value="ability_detail", typeHandler= JacksonTypeHandler.class)
private List<Integer> abilityDetail;
}

FastJsonArrayTypeHandler


import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.serializer.SerializerFeature;
import com.baomidou.mybatisplus.extension.handlers.AbstractJsonTypeHandler;
import lombok.extern.slf4j.Slf4j;
import org.apache.ibatis.type.JdbcType;
import org.apache.ibatis.type.MappedJdbcTypes;

import java.util.List;

@Slf4j
@MappedJdbcTypes(value = JdbcType.JAVA_OBJECT)
public class FastJsonArrayTypeHandler<T> extends AbstractJsonTypeHandler<Object> {
    private Class<T> type;
    public FastJsonArrayTypeHandler(Class<T> type) {
        this.type = type;
    }

    @Override
    protected List<T> parse(String json) {
        return JSON.parseArray(json, type);
    }

    @Override
    protected String toJson(Object obj) {
        return JSON.toJSONString(obj, SerializerFeature.WriteMapNullValue, SerializerFeature.WriteNullListAsEmpty, SerializerFeature.WriteNullStringAsEmpty);
    }
}

如果json存储得是实体集合List

<result property="taskLabel" column="task_label" 
    typeHandler="com.swan.task.center.dao.common.config.FastJsonArrayTypeHandler"
    javaType="com.swan.task.center.api.task.param.TaskLabelParam"/>
-- 对json中的字段进行统计

SELECT t1.label AS labelName,COUNT(1) AS sumTask FROM t_task_info, 
JSON_TABLE(task_label, "$[*]" COLUMNS ( label VARCHAR(30) PATH '$.label') ) t1
WHERE t1.label LIKE CONCAT ('%', '任务', '%')
GROUP BY t1.label   

 

json类型查询, 基本类型,对象,数组。

1.模糊查询json类型字段
存储的数据格式(字段名 people_json):

{“name”: “zhangsan”, “age”: “13”, “gender”: “男”}

代码如下(示例):

select * from table_name  where people_json->'$.name' like '%zhang%'
1
2.精确查询json类型字段
存储的数据格式(字段名 people_json):

{“name”: “zhangsan”, “age”: “13”, “gender”: “男”}

代码如下(示例):

select * from table_name  where people_json-> '$.age' = 13
1
3.模糊查询JsonArray类型字段
存储的数据格式(字段名 people_json):

[{“name”: “zhangsan”, “age”: “13”, “gender”: “男”}]

代码如下(示例):

select * from table_name  where people_json->'$[*].name' like '%zhang%'
1
4.精确查询JsonArray类型字段
存储的数据格式(字段名 people_json):

[{“name”: “zhangsan”, “age”: “13”, “gender”: “男”}]

代码如下(示例):

select * from table_name  where JSON_CONTAINS(people_json,JSON_OBJECT('age', "13"))

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

大巨魔战将

如果对您有帮助,请打赏1分钱

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值