回答

收藏

mysql本身的连接表

技术问答 技术问答 248 人阅读 | 0 人回复 | 2023-09-14

我对此有疑问,希望这是可能的。/ ^) x  l7 w) z- V6 O
我有一个来自wordpress用于存储发布的元数据数据,因此不能(容易)更改列和字段数据。
2 R4 s2 j: s) D4 a( K2 \所以表结构是$ x  X  L2 s: ^* ~: x8 y* c( L
post_id meta_key meta_value' i" P8 z% o8 E
meta键存储字段名称和meta_value,即字段值。我需要根据帖子ID将它们分组,以便在两个字段之间进行比较。我尝试了各种各样的方法!
4 V! k  w& y/ r' c: T: I因此,数据如下:/ \! N2 e5 X* [1 K0 s0 r8 _; |
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,它返回
' R8 n! Q& ]* [& e1 [' W) upost_id     concat      matt's post,        51、9、18,James' post,199那是我想要的最接近的东西。但是我不确定怎么分。我有一系列的整数(字段1和2)需要比较。
7 V+ Y9 y$ m0 }0 d, S我需要上面字符串中的第二个和第三个数字。SQL做点什么来得到这些吗?然后,我想做一些数学操作。它们基本上是用来存储经度和纬度的浮点数。我想比较它们并获得距离…。
7 w8 \' R# y+ l' n4 `; v% f2 ]0 Y我在想是否有临时表?我需要引用这两个数字。也许我可以用分隔符把字符串分开?
6 P7 }: V( _- j- L我的想法已经用完了。(ps)我也试图编写我自己的函数(如下所示),但这多次导致服务器崩溃!. D# d, F7 W6 V" u
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;               
- [5 O  |- \9 x0 J    解决方案:                                                               
0 t* Z$ K* ?& i: [1 |1 K; d* k                                                                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)
# Y) r' S8 I, }: f6 f5 Dselect 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 注意# y2 f9 _" }5 Q( `; U; k
你可能需要粗略筛选经纬度结果,然后计算昂贵的经纬度结果,或者在储存到临时表中之前。这个想法是完全忽略所有超过10英里半径的地方r1结果。
( n0 _. d: }$ F如果使用临时表,它将特定于用户对话。4 [0 @& h, _) \" T4 F% B
编辑2请查看地球形状以获取详细信息,但纬度和经度本质上总是在7分钟内超过10英里。因此,如果以度为单位记录纬度和经度,则表明纬度足以接近0.117.与目标的差异超过0.117的任何点都不能在10英里半径内。这意味着你可以像下面那样过滤r1表:1 V6 Y6 p; `# K. c
(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) 注意 如果您的数据跨越格林威治子午线、国际日期变更线或赤道,这将不是严格和正确的。假设你所有的经纬度都在北美使用,那将不是问题。
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则