需求:按照json中的某个字段进行排序
前端原型如下(可以按照某个学科进行升序降序排序):
数据存储结构:把所有的学科、得分放在一个json数组里
解决办法:直接解析排序字段
select *
from (select *,
row_number() over(order by if(subject_json=='[]',1,0),JSONExtractInt(JSONExtractArrayRaw(ifnull(subject_json,'[]'))[1],'score') desc,toInt32(extract(class_name,'\d+')),student_id) row_num,
1 page_num,
7 page_size,
count() over() total_cnt
from tmp
)
where row_num > (page_num - 1) *page_size AND row_num <= page_num * page_size
其中:
JSONExtractInt(JSONExtractArrayRaw(ifnull(subject_json,'[]'))[1],'score')
按照json数组中第一个元素的score的值进行排序。再通过开窗计算出每行数据的排名,并根据分页参数进行分页。