mysql行比较游标vs连接

时间:2013-06-20 14:41:21

标签: mysql cursor comparison row

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

例如: 我有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

2 个答案:

答案 0 :(得分: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

答案 1 :(得分: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 ;