漂流瓶推送需求的逻辑实现代码
网络编程 2021-07-05 12:58www.168986.cn编程入门
假想有一个瓶子池,当点击附近标签的时候要从池里面推送一个瓶子给用户.推送按照一定的逻辑对池里的瓶子排序,排序规则主要由两个数据决定:瓶子上次推送时间和与用户之间的距离.
本身这两个数据之间没有关联,并且sql语句里面的排序规则不能满足要求:sql里只有数据中前一个排序条件出现相同的情况时才考虑后面的排序条件.实际情况是如果按先推送时间后距离排序的话,距离就起不了作用,反之亦然.
要让两个数据产生关联,有一种做法是将这两个数据做加法或减法后排序,这必须要考虑以下情况
两个数据的数据类型不一致,一个是日期类型另一个是双精度类型
必须统一两个数据的排序方向,不能推送时间取正序而距离取反序,视实际需求而定
将这两个数据都转换成一种类型,需要一个系数来平衡它们.如果一个数据数量级极大,另一个数据数量极小,那么极小的数据再怎么变化对极大的数据产生的影响也可以忽略
狼蚁网站SEO优化来具体实现,将日期类型转换为双精度类型,操作两个数值类型的数据相对来说比较容易.mysql里面正好有这样的函数:unix_timestamp(date) -- 直接返回内部时戳值
-- 相差一天的时戳值
select unix_timestamp('2010-12-13') - unix_timestamp('2010-12-12')
-- 计算结果:86400
关于已知两地经纬度计算距离的公式,在网上搜索了一个,计算结果还算满意
ROUND((2 ASIN(SQRT(POWER(SIN(((LATPI()/180.0)-(platPI()/180.0)) / 2), 2) + COS(LATPI()/180.0) COS(platPI()/180.0) POWER(SIN((LNGPI()/180.0-plngPI()/180.0) / 2), 2))))6378.13710000,3)/10000)
接下来考虑两个数据的排序方向,我们希望的是:距离上次推送时间越久越好,与用户之间的距离越近越好.时间越久那么计算得出的差值就越大,两个数据直接相加明显不行.这里只好将时间取负值来满足与用户之间的距离越近越好的要求,然后再按正序排列.
再来让这两个数在同一数量级,根据数据测试,时间取的是秒,距离算出来是公里,直接把距离乘上一个系数(1000)换算成米来平衡二者.
最终的推送语句如下:
select BottleID,(ROUND((2 ASIN(SQRT(POWER(SIN(((LATPI()/180.0)-(platPI()/180.0)) / 2), 2) + COS(LATPI()/180.0) COS(platPI()/180.0) POWER(SIN((LNGPI()/180.0-plngPI()/180.0) / 2), 2))))6378.13710000,3)/10000)as Distance from Bottle
inner join Venue_Mapabc
on Bottle.VenueID = Venue_Mapabc.VenueID
where Bottle.IsDrift =1 and Bottle.IsEmpty =1 and IsFinished=0 and Venue_Mapabc.City = pCity
-- and (ROUND((2 ASIN(SQRT(POWER(SIN(((LATPI()/180.0)-(platPI()/180.0)) / 2), 2) + COS(LATPI()/180.0) COS(platPI()/180.0) POWER(SIN((LNGPI()/180.0-plngPI()/180.0) / 2), 2))))6378.13710000,3)/10000)>1.5
order by
(-(unix_timestamp(now())-unix_timestamp(Bottle.PlaceTime))0.5 +
(ROUND((2 ASIN(SQRT(POWER(SIN(((LATPI()/180.0)-(platPI()/180.0)) / 2), 2) + COS(LATPI()/180.0) COS(platPI()/180.0) POWER(SIN((LNGPI()/180.0-plngPI()/180.0) / 2), 2))))6378.13710000,3)/10000)0.51000)
limit 1;
前端截图:
要让两个数据产生关联,有一种做法是将这两个数据做加法或减法后排序,这必须要考虑以下情况
两个数据的数据类型不一致,一个是日期类型另一个是双精度类型
必须统一两个数据的排序方向,不能推送时间取正序而距离取反序,视实际需求而定
将这两个数据都转换成一种类型,需要一个系数来平衡它们.如果一个数据数量级极大,另一个数据数量极小,那么极小的数据再怎么变化对极大的数据产生的影响也可以忽略
狼蚁网站SEO优化来具体实现,将日期类型转换为双精度类型,操作两个数值类型的数据相对来说比较容易.mysql里面正好有这样的函数:unix_timestamp(date) -- 直接返回内部时戳值
代码如下:
-- 相差一天的时戳值
select unix_timestamp('2010-12-13') - unix_timestamp('2010-12-12')
-- 计算结果:86400
关于已知两地经纬度计算距离的公式,在网上搜索了一个,计算结果还算满意
代码如下:
ROUND((2 ASIN(SQRT(POWER(SIN(((LATPI()/180.0)-(platPI()/180.0)) / 2), 2) + COS(LATPI()/180.0) COS(platPI()/180.0) POWER(SIN((LNGPI()/180.0-plngPI()/180.0) / 2), 2))))6378.13710000,3)/10000)
接下来考虑两个数据的排序方向,我们希望的是:距离上次推送时间越久越好,与用户之间的距离越近越好.时间越久那么计算得出的差值就越大,两个数据直接相加明显不行.这里只好将时间取负值来满足与用户之间的距离越近越好的要求,然后再按正序排列.
再来让这两个数在同一数量级,根据数据测试,时间取的是秒,距离算出来是公里,直接把距离乘上一个系数(1000)换算成米来平衡二者.
最终的推送语句如下:
代码如下:
select BottleID,(ROUND((2 ASIN(SQRT(POWER(SIN(((LATPI()/180.0)-(platPI()/180.0)) / 2), 2) + COS(LATPI()/180.0) COS(platPI()/180.0) POWER(SIN((LNGPI()/180.0-plngPI()/180.0) / 2), 2))))6378.13710000,3)/10000)as Distance from Bottle
inner join Venue_Mapabc
on Bottle.VenueID = Venue_Mapabc.VenueID
where Bottle.IsDrift =1 and Bottle.IsEmpty =1 and IsFinished=0 and Venue_Mapabc.City = pCity
-- and (ROUND((2 ASIN(SQRT(POWER(SIN(((LATPI()/180.0)-(platPI()/180.0)) / 2), 2) + COS(LATPI()/180.0) COS(platPI()/180.0) POWER(SIN((LNGPI()/180.0-plngPI()/180.0) / 2), 2))))6378.13710000,3)/10000)>1.5
order by
(-(unix_timestamp(now())-unix_timestamp(Bottle.PlaceTime))0.5 +
(ROUND((2 ASIN(SQRT(POWER(SIN(((LATPI()/180.0)-(platPI()/180.0)) / 2), 2) + COS(LATPI()/180.0) COS(platPI()/180.0) POWER(SIN((LNGPI()/180.0-plngPI()/180.0) / 2), 2))))6378.13710000,3)/10000)0.51000)
limit 1;
前端截图:
编程语言
- 如何快速学会编程 如何快速学会ug编程
- 免费学编程的app 推荐12个免费学编程的好网站
- 电脑怎么编程:电脑怎么编程网咯游戏菜单图标
- 如何写代码新手教学 如何写代码新手教学手机
- 基础编程入门教程视频 基础编程入门教程视频华
- 编程演示:编程演示浦丰投针过程
- 乐高编程加盟 乐高积木编程加盟
- 跟我学plc编程 plc编程自学入门视频教程
- ug编程成航林总 ug编程实战视频
- 孩子学编程的好处和坏处
- 初学者学编程该从哪里开始 新手学编程从哪里入
- 慢走丝编程 慢走丝编程难学吗
- 国内十强少儿编程机构 中国少儿编程机构十强有
- 成人计算机速成培训班 成人计算机速成培训班办
- 孩子学编程网上课程哪家好 儿童学编程比较好的
- 代码编程教学入门软件 代码编程教程