回答

收藏

mysql本身的连接表

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

我对此有疑问,希望这是可能的。
% 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) 注意 如果您的数据跨越格林威治子午线、国际日期变更线或赤道,这将不是严格和正确的。假设你所有的经纬度都在北美使用,那将不是问题。
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则