我需要比较表中的所有行,并且需要对每次比较进行一些计算。
例如: 我有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
答案 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 ;