0

我需要比较表中的所有行,并且需要对每次比较进行一些计算。

例如:我有 3 个用户。我需要比较 a->b 并给 b 一些标记并将其插入另一个表中,然后 a->c 进行计算并存储在上面的同一个表中,然后需要比较 b ->c 并进行计算并将计算的值插入到表中。然后 c->a,c->b,-a 与上述相同。

我们如何进行这种比较?我应该使用光标吗?还有其他简单的方法吗?

我能够编写一个像这样的简单连接查询,但不知道如何进行计算并将其插入另一个表。

id,userid,lat,lng 是表结构。我需要在每次比较中返回 lat 和 lng (我的意思是当我对用户进行用户操作时)然后如上所述为第二个用户分配一个值。id 是 pk 并且 userid 将是一个非重复值并且它是唯一的。基本上同时返回 lat 和 lng 我需要根据一对一比较检查每个用户的距离计算,并根据距离给出标记,然后根据用户 ID 将这些标记存储在另一个表中。

Select * from table t1 join table t2 on t1.userid!=t2.userid

4

2 回答 2

0
Distance formula
DELIMITER $$ 

DROP   FUNCTION  IF EXISTS `GetDistance`$$ 

CREATE   FUNCTION  `GetDistance`( 
 lat1  numeric (9,6), 
 lon1  numeric (9,6), 
 lat2  numeric (9,6), 
 lon2  numeric (9,6) 
)  RETURNS   decimal (10,5) 
BEGIN 
  DECLARE  x  decimal (20,10); 
  DECLARE  pi  decimal (21,20); 
  SET  pi = 3.14159265358979323846; 
  SET  x = sin( lat1 * pi/180 ) * sin( lat2 * pi/180  ) + cos( 
 lat1 *pi/180 ) * cos( lat2 * pi/180 ) * cos(  abs ( (lon2 * pi/180) - 
 (lon1 *pi/180) ) ); 
  SET  x = atan( ( sqrt( 1- power( x, 2 ) ) ) / x ); 
  RETURN  ( 1.852 * 60.0 * ((x/pi)*180) ) / 1.609344; 
END $$ 

DELIMITER ;

我需要根据距离应用以下几点

30 miles or less = 2 points
    30 - 50 = 1 points
    50 and up = 0 points
于 2013-06-21T05:27:53.013 回答
0

我创造了一些类似的东西并且可以工作

INSERT INTO summary (user_id1, user_id2, distance, points)
SELECT a1.userid, a2.userid, 
    GetDistances(a1.lat,a1.lng,a2.lat,a2.lng) as distance,
GetDistance(a1.lat,a1.lng,a2.lat,a2.lng) as points FROM location a1 JOIN location a2 ON a1.userid <> a2.userid
  ON DUPLICATE KEY UPDATE 
    distance=VALUES(distance),
    points=points+values(points);

积分

DELIMITER $$ 

DROP   FUNCTION  IF EXISTS `GetDistance`$$ 

CREATE   FUNCTION  `GetDistance`( 
 lat1  numeric (9,6), 
 lon1  numeric (9,6), 
 lat2  numeric (9,6), 
 lon2  numeric (9,6) 
)  RETURNS   decimal (10,5) 
BEGIN 
  DECLARE  x  decimal (20,10); 
  DECLARE  pi  decimal (21,20);
  DECLARE final decimal (10,5);
DECLARE newvalue decimal (10,5);  
  SET  pi = 3.14159265358979323846; 
  SET  x = sin( lat1 * pi/180 ) * sin( lat2 * pi/180  ) + cos( 
 lat1 *pi/180 ) * cos( lat2 * pi/180 ) * cos(  abs( (lon2 * pi/180) - 
 (lon1 *pi/180) ) ); 
  SET  x = atan( ( sqrt( 1- power( x, 2 ) ) ) / x ); 
  SET final =  ( 1.852 * 60.0 * ((x/pi)*180) ) / 1.609344;

case WHEN final < 247 THEN  
SET newvalue = 2;
WHEN final > 600 THEN
SET newvalue = 1; 
else SET newvalue = 0;
END CASE;
RETURN newvalue;
END $$ 

DELIMITER ;

对于距离

DELIMITER $$ 

DROP   FUNCTION  IF EXISTS `GetDistances`$$ 

CREATE   FUNCTION  `GetDistances`( 
 lat1  numeric (9,6), 
 lon1  numeric (9,6), 
 lat2  numeric (9,6), 
 lon2  numeric (9,6) 
)  RETURNS   decimal (10,5) 
BEGIN 
  DECLARE  x  decimal (20,10); 
  DECLARE  pi  decimal (21,20);
  SET  pi = 3.14159265358979323846; 
  SET  x = sin( lat1 * pi/180 ) * sin( lat2 * pi/180  ) + cos( 
 lat1 *pi/180 ) * cos( lat2 * pi/180 ) * cos(  abs( (lon2 * pi/180) - 
 (lon1 *pi/180) ) ); 
  SET  x = atan( ( sqrt( 1- power( x, 2 ) ) ) / x ); 
 RETURN ( 1.852 * 60.0 * ((x/pi)*180) ) / 1.609344;
END $$ 

DELIMITER ;
于 2013-06-21T09:36:15.957 回答