• 企业400电话
  • 微网小程序
  • AI电话机器人
  • 电商代运营
  • 全 部 栏 目

    企业400电话 网络优化推广 AI电话机器人 呼叫中心 网站建设 商标✡知产 微网小程序 电商运营 彩铃•短信 增值拓展业务
    漂流瓶推送需求的逻辑实现代码
    本身这两个数据之间没有关联,并且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;

    前端截图:

    您可能感兴趣的文章:
    • PHP实现简单搜歌的方法
    • PHP实现的memcache环形队列类实例
    • 如何实现php图片等比例缩放
    • PHP生成树的方法
    • php递归实现无限分类的方法
    • php类自动加载器实现方法
    • PHP实现的迷你漂流瓶
    上一篇:IIS 301重定向与程序代码实现301重定向的差别
    下一篇:关于代码阅读问题的小技巧 脚本之家原创(适合所有网站)不定时更新
  • 相关文章
  • 

    © 2016-2020 巨人网络通讯 版权所有

    《增值电信业务经营许可证》 苏ICP备15040257号-8

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