漂流瓶推送需求的逻辑实现代码

所属分类: 网络编程 / 相关技巧 阅读数: 563
收藏 0 赞 0 分享
本身这两个数据之间没有关联,并且sql语句里面的排序规则不能满足要求:sql里只有数据中前一个排序条件出现相同的情况时才考虑后面的排序条件.实际情况是如果按先推送时间后距离排序的话,距离就起不了作用,反之亦然.

要让两个数据产生关联,有一种做法是将这两个数据做加法或减法后排序,但是这必须要考虑以下情况

两个数据的数据类型不一致,一个是日期类型另一个是双精度类型
必须统一两个数据的排序方向,不能推送时间取正序而距离取反序,视实际需求而定
将这两个数据都转换成一种类型,需要一个系数来平衡它们.如果一个数据数量级极大,另一个数据数量极小,那么极小的数据再怎么变化对极大的数据产生的影响也可以忽略
下面来具体实现,首先将日期类型转换为双精度类型,操作两个数值类型的数据相对来说比较容易.mysql里面正好有这样的函数:unix_timestamp(date) -- 直接返回内部时戳值
复制代码 代码如下:

-- 相差一天的时戳值
select 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) * POWER(SIN((LNG*PI()/180.0-plng*PI()/180.0) / 2), 2))))*6378.137*10000,3)/10000)

接下来考虑两个数据的排序方向,我们希望的是:距离上次推送时间越久越好,与用户之间的距离越近越好.时间越久那么计算得出的差值就越大,两个数据直接相加明显不行.这里只好将时间取负值来满足与用户之间的距离越近越好的要求,然后再按正序排列.

再来让这两个数在同一数量级,根据数据测试,时间取的是秒,距离算出来是公里,直接把距离乘上一个系数(1000)换算成米来平衡二者.

最终的推送语句如下:
复制代码 代码如下:

select BottleID,(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*10000,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(((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*10000,3)/10000)>1.5
order by

(-(unix_timestamp(now())-unix_timestamp(Bottle.PlaceTime))*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*10000,3)/10000)*0.5*1000)


limit 1;

前端截图:

更多精彩内容其他人还在看

idea2020.1 常用设置图文详解

这篇文章主要介绍了idea2020.1 常用设置,本文通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
收藏 0 赞 0 分享

IDEA2019.3在Plugins中搜索不到translation的解决

这篇文章主要介绍了IDEA2019.3在Plugins中搜索不到translation的解决,文中通过图文的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
收藏 0 赞 0 分享

Idea 2019.3 本应该搜索到的插件却搜索不到的解决方法

这篇文章主要介绍了Idea 2019.3 本应该搜索到的插件却搜索不到,本文通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
收藏 0 赞 0 分享

Scala 环境搭建及IDEA工具的配置使用教程

这篇文章主要介绍了Scala 之 环境搭建 及 工具IDEA的配置使用,本文通过实例图文相结合给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
收藏 0 赞 0 分享

程序员喜欢的5款最佳代码比较工具

这篇文章主要介绍了程序员喜欢的5款最佳代码比较工具,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
收藏 0 赞 0 分享

vscode安装rainbow-fart(鼓励师)插件

这篇文章主要介绍了vscode安装rainbow-fart(鼓励师)插件的相关知识,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
收藏 0 赞 0 分享

VSCode程序猿彩虹屁插件rainbow fart体验篇

这篇文章主要介绍了VSCode程序猿彩虹屁插件rainbow fart体验,本文通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
收藏 0 赞 0 分享

Rust 能够取代 C 语言吗

Rust 是 Mozilla 基金会的一个雄心勃勃的项目,号称是 C 语言和 C++ 的继任者,这篇文章主要介绍了Rust 能够取代 C 语言吗的相关知识,需要的朋友可以参考下
收藏 0 赞 0 分享

vscode配置leetcode插件并解决无法登录问题(图文详解)

这篇文章主要介绍了vscode配置leetcode插件并解决无法登录问题,本文通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
收藏 0 赞 0 分享

StringBuider 在什么条件下、如何使用效率更高

都说 StringBuilder 在处理字符串拼接上效率要强于 String,但有时候我们的理解可能会存在一定的偏差。今天小编给大家带来一篇教程关于StringBuider 在什么条件下、如何使用效率更高?感兴趣的朋友一起看看吧
收藏 0 赞 0 分享
查看更多