您可以在 MySQL 中使用递归 CTE:
with recursive cte(r, d, c, gpstrace) as (
select t.route_id, 6371*acos(cos(radians(json_extract(t.gpstrace, '$[0][0]')))
* cos(radians(json_extract(t.gpstrace, '$[1][0]')))
* cos(radians(json_extract(t.gpstrace, '$[0][1]') - json_extract(t.gpstrace, '$[1][1]')))
+ sin(radians(json_extract(t.gpstrace, '$[0][0]')))
* sin(radians(json_extract(t.gpstrace, '$[1][0]')))), 1, t.gpstrace from testtable t
union all
select c.r, c.d + 6371*acos(cos(radians(json_extract(c.gpstrace, concat('$[', c.c, '][0]'))))
* cos(radians(json_extract(c.gpstrace, concat('$[', c.c+1, '][0]'))))
* cos(radians(json_extract(c.gpstrace, concat('$[', c.c, '][1]')) - json_extract(c.gpstrace, concat('$[', c.c+1, '][1]'))))
+ sin(radians(json_extract(c.gpstrace, concat('$[', c.c, '][0]'))))
* sin(radians(json_extract(c.gpstrace, concat('$[', c.c+1, '][0]'))))), c.c + 1, c.gpstrace
from cte c
where c.c + 1 < json_length(c.gpstrace)
),
results(r, d) as (select r, d from cte where c + 1 >= json_length(gpstrace))
select * from results r where r.d = (select max(r1.d) from results r1);
见演示。