我需要一个函数,它将接受4个参数,以便使用K2 extra_fields
进行一些计算,并将结果返回到SELECT
语句。
我需要函数来计算两点之间的距离。第一个点的坐标将在项目的extra_fields
中找到。第二个点的坐标将在php脚本中手动给出。
我的extra_fields
包含:
[{"id":"1","value":"40.111"},{"id":"2","value":"20.222"}]
其中id[1]和id[2]为坐标(经纬度)。
SELECT语句应该看起来像:
SELECT id, title, **FUNCTION_GOES_HERE** AS 'distance'
FROM k2_items;
我不是在找距离计算算法。问题是如何从extra_fields
字段中提取坐标。什么好主意吗?
因为不能更改表设计,所以必须进行一些繁琐的字符串解析。下面是一个例子:
SELECT
SUBSTRING_INDEX(SUBSTRING_INDEX(extra_fields, '"value":"', -2), '"', 1) as latitude,
SUBSTRING_INDEX(SUBSTRING_INDEX(extra_fields, '"value":"', -1), '"', 1) as longitude
FROM k2_items;
解释:
我们在这些值中发现了两次子字符串"value":":
[{"id":"1","value":"40.111"},{"id":"2","value":"20.222"}]
^ first time ^ second time
SUBSTRING_INDEX(extra_fields, '"value":"', -2
将为我们提供样本数据的子字符串,从指针的最后第二个出现点开始,这里是第一个出现点:
40.111"},{"id":"2","value":"20.222"}]
对于纬度,我们需要子字符串直到下一个双引号。这是一个简单的例子:SUBSTRING_INDEX(haystack, needle, 1)
,第一个表达式是haystack,双引号是needle。
SUBSTRING_INDEX(SUBSTRING_INDEX(extra_fields, '"value":"', -2), '"', 1)
给出了期望的结果:
40.111
通过同样的逻辑,我们将得到经度