亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

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

 更新時間:2010年12月17日 11:09:28   作者:  
假想有一個瓶子池,當(dāng)點擊附近標(biāo)簽的時候要從池里面推送一個瓶子給用戶.推送按照一定的邏輯對池里的瓶子排序,排序規(guī)則主要由兩個數(shù)據(jù)決定:瓶子上次推送時間和與用戶之間的距離.
本身這兩個數(shù)據(jù)之間沒有關(guān)聯(lián),并且sql語句里面的排序規(guī)則不能滿足要求:sql里只有數(shù)據(jù)中前一個排序條件出現(xiàn)相同的情況時才考慮后面的排序條件.實際情況是如果按先推送時間后距離排序的話,距離就起不了作用,反之亦然.

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

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

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

關(guān)于已知兩地經(jīng)緯度計算距離的公式,在網(wǎng)上搜索了一個,計算結(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)

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

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

最終的推送語句如下:
復(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;

前端截圖:

相關(guān)文章

  • Git如何合并多次提交

    Git如何合并多次提交

    這篇文章主要介紹了Git合并多次提交問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-05-05
  • vscode如何安裝漢化和Python智能感知

    vscode如何安裝漢化和Python智能感知

    VSCode(VisualStudioCode)是由微軟研發(fā)的一款免費、開源的跨平臺文本(代碼)編輯器,算是目前前端開發(fā)幾乎完美的軟件開發(fā)工具。今天我們來看看它如何使用呢
    2020-01-01
  • 一個批量編碼轉(zhuǎn)換及ASP/JS加解密/簡繁轉(zhuǎn)換的工具

    一個批量編碼轉(zhuǎn)換及ASP/JS加解密/簡繁轉(zhuǎn)換的工具

    一個批量編碼轉(zhuǎn)換及ASP/JS加解密/簡繁轉(zhuǎn)換的工具...
    2007-05-05
  • Git里多種撤銷操作的最佳方法

    Git里多種撤銷操作的最佳方法

    這篇文章我們會給大家介紹關(guān)于Git里的多種撤銷操作,我會講解某些你需要“撤銷”已做出的修改的常見場景,以及利用 Git 進(jìn)行這些操作的最佳方法。下面來一起看看吧。
    2016-09-09
  • 微信 小程序Demo導(dǎo)入詳細(xì)介紹

    微信 小程序Demo導(dǎo)入詳細(xì)介紹

    這篇文章主要介紹了微信 小程序Demo導(dǎo)入詳細(xì)介紹的相關(guān)資料,需要的朋友可以參考下
    2016-09-09
  • 樹莓派安裝mjpg-streamer使用攝像頭的方法

    樹莓派安裝mjpg-streamer使用攝像頭的方法

    這篇文章主要介紹了樹莓派安裝mjpg-streamer使用攝像頭,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-03-03
  • VSCode設(shè)置網(wǎng)頁代碼實時預(yù)覽的實現(xiàn)

    VSCode設(shè)置網(wǎng)頁代碼實時預(yù)覽的實現(xiàn)

    這篇文章主要介紹了VSCode設(shè)置網(wǎng)頁代碼實時預(yù)覽的實現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-04-04
  • 詳解秒殺系統(tǒng)設(shè)計的5個要點

    詳解秒殺系統(tǒng)設(shè)計的5個要點

    這篇文章主要為大家介紹了秒殺系統(tǒng)設(shè)計的5個要點詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-01-01
  • Git 如何放棄所有本地修改的方法

    Git 如何放棄所有本地修改的方法

    這篇文章主要介紹了Git 如何放棄所有本地修改的方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-11-11
  • 推薦幾個好用的WordPress媒體庫分類/文件夾管理插件

    推薦幾個好用的WordPress媒體庫分類/文件夾管理插件

    這篇文章主要介紹了推薦幾個好用的WordPress媒體庫分類/文件夾管理插件
    2021-09-09

最新評論