佳木斯湛栽影视文化发展公司

主頁(yè) > 知識(shí)庫(kù) > 漂流瓶推送需求的邏輯實(shí)現(xiàn)代碼

漂流瓶推送需求的邏輯實(shí)現(xiàn)代碼

熱門標(biāo)簽:網(wǎng)站文章發(fā)布 服務(wù)器配置 智能手機(jī) 美圖手機(jī) 呼叫中心市場(chǎng)需求 銀行業(yè)務(wù) 鐵路電話系統(tǒng) 檢查注冊(cè)表項(xiàng)
本身這兩個(gè)數(shù)據(jù)之間沒(méi)有關(guān)聯(lián),并且sql語(yǔ)句里面的排序規(guī)則不能滿足要求:sql里只有數(shù)據(jù)中前一個(gè)排序條件出現(xiàn)相同的情況時(shí)才考慮后面的排序條件.實(shí)際情況是如果按先推送時(shí)間后距離排序的話,距離就起不了作用,反之亦然.

要讓兩個(gè)數(shù)據(jù)產(chǎn)生關(guān)聯(lián),有一種做法是將這兩個(gè)數(shù)據(jù)做加法或減法后排序,但是這必須要考慮以下情況

兩個(gè)數(shù)據(jù)的數(shù)據(jù)類型不一致,一個(gè)是日期類型另一個(gè)是雙精度類型
必須統(tǒng)一兩個(gè)數(shù)據(jù)的排序方向,不能推送時(shí)間取正序而距離取反序,視實(shí)際需求而定
將這兩個(gè)數(shù)據(jù)都轉(zhuǎn)換成一種類型,需要一個(gè)系數(shù)來(lái)平衡它們.如果一個(gè)數(shù)據(jù)數(shù)量級(jí)極大,另一個(gè)數(shù)據(jù)數(shù)量極小,那么極小的數(shù)據(jù)再怎么變化對(duì)極大的數(shù)據(jù)產(chǎn)生的影響也可以忽略
下面來(lái)具體實(shí)現(xiàn),首先將日期類型轉(zhuǎn)換為雙精度類型,操作兩個(gè)數(shù)值類型的數(shù)據(jù)相對(duì)來(lái)說(shuō)比較容易.mysql里面正好有這樣的函數(shù):unix_timestamp(date) -- 直接返回內(nèi)部時(shí)戳值
復(fù)制代碼 代碼如下:

-- 相差一天的時(shí)戳值
select unix_timestamp('2010-12-13') - unix_timestamp('2010-12-12')
-- 計(jì)算結(jié)果:86400

關(guān)于已知兩地經(jīng)緯度計(jì)算距離的公式,在網(wǎng)上搜索了一個(gè),計(jì)算結(jié)果還算滿意
復(fù)制代碼 代碼如下:

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)

接下來(lái)考慮兩個(gè)數(shù)據(jù)的排序方向,我們希望的是:距離上次推送時(shí)間越久越好,與用戶之間的距離越近越好.時(shí)間越久那么計(jì)算得出的差值就越大,兩個(gè)數(shù)據(jù)直接相加明顯不行.這里只好將時(shí)間取負(fù)值來(lái)滿足與用戶之間的距離越近越好的要求,然后再按正序排列.

再來(lái)讓這兩個(gè)數(shù)在同一數(shù)量級(jí),根據(jù)數(shù)據(jù)測(cè)試,時(shí)間取的是秒,距離算出來(lái)是公里,直接把距離乘上一個(gè)系數(shù)(1000)換算成米來(lái)平衡二者.

最終的推送語(yǔ)句如下:
復(fù)制代碼 代碼如下:

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實(shí)現(xiàn)簡(jiǎn)單搜歌的方法
  • PHP實(shí)現(xiàn)的memcache環(huán)形隊(duì)列類實(shí)例
  • 如何實(shí)現(xiàn)php圖片等比例縮放
  • PHP生成樹(shù)的方法
  • php遞歸實(shí)現(xiàn)無(wú)限分類的方法
  • php類自動(dòng)加載器實(shí)現(xiàn)方法
  • PHP實(shí)現(xiàn)的迷你漂流瓶

標(biāo)簽:樂(lè)山 滄州 沈陽(yáng) 新疆 上海 河南 長(zhǎng)治 紅河

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《漂流瓶推送需求的邏輯實(shí)現(xiàn)代碼》,本文關(guān)鍵詞  ;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問(wèn)題,煩請(qǐng)?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無(wú)關(guān)。
  • 相關(guān)文章
  • 收縮
    • 微信客服
    • 微信二維碼
    • 電話咨詢

    • 400-1100-266
    堆龙德庆县| 永平县| 延川县| 灵璧县| 蚌埠市| 正镶白旗| 雷山县| 朝阳区| 秦皇岛市| 无锡市| 呼伦贝尔市| 红河县| 吴旗县| 上犹县| 原阳县| 内江市| 义乌市| 晋州市| 沿河| 吐鲁番市| 阜康市| 多伦县| 图们市| 天镇县| 昌吉市| 涪陵区| 桐梓县| 康平县| 峨眉山市| 恩施市| 绥阳县| 嵊泗县| 西丰县| 乡宁县| 沧源| 金坛市| 聂荣县| 和平县| 神木县| 商河县| 光泽县|