漂流瓶推送需求的逻辑实现代码
这两个数据没有相关性,sql语句中的排序规则不能满足要求。在:sql中,只有当数据中前面的排序条件相同时,才会考虑后面的排序条件。实际情况是,如果按距离前推时间排序,距离起不到作用,反之亦然。要使两个数据相关联,一种方法是在加法或减法后对两个数据进行排序。但是,必须考虑以下情况:两个数据的数据类型不一致。一种是日期类型,另一种是双精度类型。两个数据的排序方向必须统一。不可能推时间取正序,推距离取逆序。根据实际需求,将两种数据转换为一种类型,需要一个系数来平衡它们。如果一个数据在数量级上极大,另一个数据在数量上极小,那么,无论微小的数据如何变化,对庞大数据的影响都可以忽略不计。首先,将日期类型转换为双精度类型。操作两种数据类型的数据相对容易。mysql正好有这样一个函数: UNIX _ timestamp(date)——直接返回内部时间戳值。复制代码如下:-选择UNIX _ timestamp ('2010-12-13 '),与时间戳值相差一天。-UNIX _ timestamp(' 2010-12-12 ')-计算结果:86400。至于已知的计算两地经纬度距离的公式,网上搜了一个。计算结果令人满意。副本代码的代码如下: round((2 * asin)(sqrt(power(sin)((lat * pi()/180.0)-(plat * pi()/180.0))/2)。2)cos(lat * pi()/180.0)* cos(plat * pi()/180.0)*功率(sin((LNG * pi()/180.0-plng * pi()/180.0)/2),2)。我们希望:从最后一次推送开始就尽可能的长,并且尽可能的贴近用户。时间越长,计算出的差值就越大。直接加两个数据显然是不可行的。这里我们要取一个负时间,满足:和用户的距离尽可能近的要求,然后按照正的顺序排列。然后,让这两个数字处于同一数量级。根据数据测试,时间为秒,距离为公里。距离直接乘以一个系数(1000)并转换成米来平衡两者。最终推送语句如下: Copy代码如下: Select瓶子ID,(round((2 * asin)(sqrt(power(sin)(lat * pi()/180.0)-(plat * pi()/)。2)COS(LAT * PI()/180.0)* COS(plat * PI()/180.0)* POWER(SIN((LNG * PI()/180.0-plng * PI()/180.0)/2),2)))* 6378.137 * 10000,3)/10000)作为瓶内连接Venue_Mapabc on Bottle的距离。VenueID=Venue_Mapabc。瓶子在哪里。1和瓶子。IsEmpty=1,IsFinished=0,Venue_Mapabc。city=pCity-and(ROUND((2 * ASIN)(SQRT(POWER(SIN)((LAT * PI()/180.0)-(plat * PI()/180.0))/2),2)COS(LAT * PI()/180.0)* COS(plat * PI()/180.0)* POWER(SIN((LNG * PI()/180.0-plng * PI()/180.0)/2),2)))* 6378.137 *place time))* 0.5(ROUND((2 * ASIN)(SQRT(POWER(SIN)((LAT * PI()/180.0)-(plat * PI()/180.0))/2),2)COS(LAT * PI()/180.0)* COS(plat * PI()/180.0)* POWER(SIN((LNG * PI()/180.0-plng * PI()/180.0)/2),2)))* 6378.137。前端截图:
版权声明:漂流瓶推送需求的逻辑实现代码是由宝哥软件园云端程序自动收集整理而来。如果本文侵犯了你的权益,请联系本站底部QQ或者邮箱删除。