漂流瓶推送需求的逻辑实现代码_相关技巧

本身这两个数据之间没有关联,并且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;

前端截图:

时间: 2024-07-29 13:01:46

漂流瓶推送需求的逻辑实现代码_相关技巧的相关文章

.net平台推送ios消息的实现方法_实用技巧

本文实例讲述了.net平台推送ios消息的实现方法.分享给大家供大家参考. 具体实现步骤如下: 1.ios应用程序中允许向客户推送消息 2.需要有苹果的证书以及密码(怎么获取,网上搜一下,需要交费的) 3.iphone手机一部,安装了该ios应用程序 4..net 项目中引用PushSharp.Apple.dll,PushSharp.Core.dll(这两个文件在网上搜一下,有源码的) 5.开始写代码,定义全局的对象PushBroker pusher = new PushBroker(); 6.

ASP.NET实现推送文件到浏览器的方法_实用技巧

本文实例讲述了ASP.NET实现推送文件到浏览器的方法.分享给大家供大家参考.具体分析如下: 这里主要实现从服务器到浏览器,推送文件,提供用户下载/浏览的功能. 提示: 在AJAX UpdatePanel里面将无效.如果代码从按钮单击事件中被调用,该按钮需要在 AJAX UpdatePanel的外部. 具体代码如下: /// <summary> /// Downloads (pushes) file to the client browser. /// **** NOTE **** Canno

ios-求c# .net 服务器端推送消息给iphone的代码。

问题描述 求c# .net 服务器端推送消息给iphone的代码. 我现在已经实现了mac版的 pushmebaby发送消息到手机上,能够收到. 在网上找到几天了,找到的代码都有能够执行,但手机收不到.请求切实可行的代码,然后我再去找其它原因.感谢. 解决方案 http://www.cnblogs.com/shixudong/p/3601517.html 解决方案二: 参考一下这个链接 http://download.csdn.net/download/tskpcp/5022372 解决方案三:

填一个漂流瓶 送上给汶川的祝福

中介交易 http://www.aliyun.com/zixun/aggregation/6858.html">SEO诊断 淘宝客 云主机 技术大厅 转眼间,汶川地震离我们快有一年时间了,在这一年时间内虽然有金融危机的压力.猪流感的侵袭,但是大家仍没有忘却汶川地震那段时间的那一幕幕感人的画面,没有忘却了那时对汶川的许诺,没有忘记了那时对汶川的祝福. 2008年5月12日14时28分,一瞬之间即成国殇.快一年了,大地震中遇难的同胞,你们在天国里好吗?重建物质家园和精神家园的灾区同胞,一直牵挂

微信推送模板消息的PHP代码整理

最近做过一个需要推送消息的系统,就研究了一下微信的模板消息的推送.由于认证过的微信号,就用测试号做的,但是过程基本一致. 本文基于微信平台的官方文档写成,http://mp.weixin.qq.com/debug/cgi-bin/readtmpl?t=tmplmsg/faq_tmpl 首先,得在微信的后台管理中设置一下,模板消息的格式,获取到一个模板消息的id {{first.DATA}}   被撕的人:{{name.DATA}}   被撕人的组别:{{zu.DATA}}   被撕时间:{{ti

iOS消息推送原理及具体实现代码_IOS

一.消息推送原理 在实现消息推送之前先提及几个于推送相关概念,如下图1-1: 1.Provider:就是为指定IOS设备应用程序提供Push的服务器,(如果IOS设备的应用程序是客户端的话,那么Provider可以理解为服务端[消息的发起者]): 2.APNS:Apple Push Notification Service[苹果消息推送服务器]: 3.iPhone:用来接收APNS下发下来的消息: 4.Client App:IOS设备上的应用程序,用来接收iphone传递APNS下发的消息到制定

如何向前端推送用户请求的信息?_编程10000问

postinfo.htm<head><title>星河影动之回应用户请求信息</title></head><body> <form action="postdata.asp" method="post"><?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /> ' 使用

.net jMail邮件发送(含抄送、密送、多发、日志记录)实例代码_实用技巧

jmail是一个第三方邮件操作组件,通常位于web服务器端,实现收邮件及发邮件功能(客户端用Foxmail这类就很好了).可以利用它轻松实现发邮件.抄送.密送.多发.日志记录及收邮件功能.本章要讲的,就是:发邮件.抄送.密送.多发.日志记录. 一.组件准备下载JMail44_pro并安装(记下安装路径) 找到安装路径,将其中的jmail.dll复制到项目中 二.核心发送代码新建MailAPI.cs,并输入以下代码 复制代码 代码如下: using System;using System.Coll

网页(aspx)与用户控件(ascx)交互逻辑处理实现_实用技巧

几个页面(ASPX)都使用一些相同的控件,一个文本框,二个按钮(搜索和导出),为了以后好维护,把这相同的部分抽取放在一个用户控件(ASCX)上.现需要处理逻辑如下 搜索事件处理的逻辑在各个页面处理. 问题是按钮在用户控件内,Click事件怎样写在各个页面上? 每个页面的搜索结果不同的格式,因此把结果显示于各自的页面上. 用户控件的导出默认是Enabled="false" ,当有搜索结果时,它才会变为true. 它怎样知道各个页面是否已经有了结果? 用户控件的文本框的值,作为搜索条件,也