|
我对此有疑问,希望这是可能的。
% A+ k) f, x. o t( n. Y f3 X3 i我有一个来自wordpress用于存储发布的元数据数据,因此不能(容易)更改列和字段数据。
. Q2 M! I( G6 X5 C2 j& w所以表结构是- B" ]3 l. ~, R) M* V" Q$ T6 W- [
post_id meta_key meta_value
$ x7 j! a; A7 j9 pmeta键存储字段名称和meta_value,即字段值。我需要根据帖子ID将它们分组,以便在两个字段之间进行比较。我尝试了各种各样的方法!/ ^! W( f+ `# b0 g
因此,数据如下:- B6 c, x' J* n
post_id meta_key meta_value1 _wp_field0 101 _wp_field1 51 _wp_field2 91 _wp_field3 "matt's post"1 _wp_field3 1552 _wp_field 512 512 _wp_field _wp_field 2 182 _wp_field3 "james' post"2 _wp_field3 199我已经完成了GROUP_CONCAT,它返回
6 f& z6 L o; T, ^" q( c7 o! lpost_id concat matt's post, 51、9、18,James' post,199那是我想要的最接近的东西。但是我不确定怎么分。我有一系列的整数(字段1和2)需要比较。
X. h" h1 Z2 k1 p6 q' Y+ Q我需要上面字符串中的第二个和第三个数字。SQL做点什么来得到这些吗?然后,我想做一些数学操作。它们基本上是用来存储经度和纬度的浮点数。我想比较它们并获得距离…。
+ N2 C( y o. g1 {- P% N1 Z我在想是否有临时表?我需要引用这两个数字。也许我可以用分隔符把字符串分开?3 \% E+ c5 T/ H X
我的想法已经用完了。(ps)我也试图编写我自己的函数(如下所示),但这多次导致服务器崩溃!* R( M7 }& a0 Y9 z! _
DROP FUNCTION get_lat;DELIMITER $$CREATE FUNCTION get_lat(in_post_id INT)RETURNS FLOATREADS SQL DATABEGINDECLARE latitude FLOAT;SELECT meta_value INTO latitude FROM wp_postmeta WHERE post_id = in_post_id AND meta_key = 'field1';RETURN (latitude);END $$DELIMITER;DROP FUNCTION get_lon;DELIMITER $$CREATE FUNCTION get_lon(in_post_id INT)RETURNS FLOATREADS SQL DATABEGINDECLARE longitude FLOAT;SELECT meta_value INTO longitude FROM wp_postmeta WHERE post_id = in_post_id AND meta_key = 'field2';RETURN (longitude);END $$DELIMITER;SELECT post_id,get_lat(post_id)as latitude,get_lon(post_id) as longitude FROM wp_postmeta GROUP BY post_id; * D& A/ k' W, m; O
解决方案:
2 f: V- i% ~' _8 J% a ~ select t1.post_id,t1.meta_value as lat,t2.meta_value as lonfrom metatdatatable t1,metadatatable t2where t1.meta_key = "_wp_field1"and t2.post_id = t1.post_idand t2.meta_key = "_wp_field2"编辑…在此基础上计算年经/纬度,可以创建临时表,也可以将结果内联用于类似于以下查询(简化DISTANCE calc). ~# p3 n4 k \& Z# E
select d1.post_id,d1.distancefrom(select r1.post_id,ABS($lat - r1.lat) ABS($lon - r1.lon) as DISTANCEfrom (select t1.post_id,t1.meta_value as lat,t2.meta_value as lon from metatdatatable t1,metadatatable t2 where t1.meta_key = "_wp_field1" and t2.post_id = t1.post_id and t2.meta_key = "_wp_field2") as r1) as d1where d1.distance 注意
5 D* J! h0 @1 |# E# V" w6 b你可能需要粗略筛选经纬度结果,然后计算昂贵的经纬度结果,或者在储存到临时表中之前。这个想法是完全忽略所有超过10英里半径的地方r1结果。& a6 N, Q$ g: d2 i" c. w5 F! K1 D
如果使用临时表,它将特定于用户对话。
0 X d/ u( J% K! G) Z) k, `7 d d$ |$ I7 J编辑2请查看地球形状以获取详细信息,但纬度和经度本质上总是在7分钟内超过10英里。因此,如果以度为单位记录纬度和经度,则表明纬度足以接近0.117.与目标的差异超过0.117的任何点都不能在10英里半径内。这意味着你可以像下面那样过滤r1表:
8 Q3 S5 T2 b) d; h6 Q4 X(select t1.post_id,t1.meta_value as lat,t2.meta_value as lon from metatdatatable t1,metadatatable t2 where t1.meta_key = "_wp_field1" and t2.post_id = t1.post_id and t2.meta_key = "_wp_field2" and ABS(t2.meta_value - $lon) 注意 如果您的数据跨越格林威治子午线、国际日期变更线或赤道,这将不是严格和正确的。假设你所有的经纬度都在北美使用,那将不是问题。 |
|