如何构建mySQL函数来访问K2 extra_fields


How to build a mySQL function to access K2 extra_fields

我需要一个函数,它将接受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

通过同样的逻辑,我们将得到经度