2017-01-10 22 views
0

我有一個請求(在PHP代碼):MySQL:如何按等級和距離排序?

 $sql = 
      "SELECT id_, name_, status, starsCount, photoFilename, " 
      . "(3959 * acos(cos(radians('$lastPosition_lat')) * 
       cos(radians(objLatitude)) * 
       cos(radians(objLongitude) - 
       radians('$lastPosition_long')) + " 
      . "sin(radians('$lastPosition_lat')) * 
       sin(radians(objLatitude)))) 
       AS distance 
       FROM markets " 
      . "ORDER BY distance ASC, starsCount DESC " 
      . "LIMIT $itemsWatched,15"; 

我需要通過排名分類附近的市場(介於1和5星)。

或者,我可以得到當前用戶的最小和最大範圍內的另一部分市場,並在第二個查詢按排名獲得排序。但我認爲,這種方式會非常緩慢。

你能幫助我獲得通過快速查詢距離和排名分類市場的名單?

回答

0

感謝所有。我重拍了我的想法,並自己找到答案。

$sql = 
      "SELECT MIN(
      (3959 * acos(cos(radians('$lastPosition_lat')) * 
       cos(radians(objLatitude)) * 
       cos(radians(objLongitude) - 
       radians('$lastPosition_long')) + 
      sin(radians('$lastPosition_lat')) * 
       sin(radians(objLatitude))))) 
       AS minDistance, 
      MAX(3959 * acos(cos(radians('$lastPosition_lat')) * 
       cos(radians(objLatitude)) * 
       cos(radians(objLongitude) - 
       radians('$lastPosition_long')) + 
      sin(radians('$lastPosition_lat')) * 
       sin(radians(objLatitude)))) 
       AS maxDistance 
      FROM markets            
      LIMIT $itemsWatched,15"; 
    $query = $mysqli->query($sql); 
    $resQ = mysqli_fetch_row($query); 
    $minDis = "0"; 
    $maxDis = "0"; 
    if ($resQ){ 
     $minDis = $resQ[0]; 
     $maxDis = $resQ[1]; 
    } 
    $sql = 
      "SELECT id_, name_, status, starsCount, photoFilename, " 
      . "(3959 * acos(cos(radians('$lastPosition_lat')) * 
       cos(radians(objLatitude)) * 
       cos(radians(objLongitude) - 
       radians('$lastPosition_long')) + " 
      . "sin(radians('$lastPosition_lat')) * 
       sin(radians(objLatitude)))) 
       AS distance 
       FROM markets " 
      . "HAVING distance BETWEEN '$minDis' AND '$maxDis' " 
      . "ORDER BY starsCount DESC " 
      . "LIMIT $itemsWatched,15"; 

現在它完美地工作。 我們做什麼?例如,我們從數據庫(LIMIT)獲得項目10-25,計算這部分電話(用戶)的MIN和MAX距離。因此,用戶總是首先看到具有最佳評級(受歡迎程度)的市場,當他們與市場之間的距離(每15個市場用戶首先看到具有最佳評級的市場)。 希望這可以幫助那些想要根據距離和評分動態分類對象的人!

0

,如果我得到你的問題所在,你總是可以限制的距離(其中距離< X公里),做一個簡單的公式來計算等級/距離比,在這種情況下,你想表現出很高的評價,和附近的第一?你將有一個公式:距離/評級,順序升序。

+0

我的情況比較簡單,比你想象的。評級是手錶的計數(用戶唯一訪問[INT])。所以,我試圖按距離排序並計數(INT值)。我現在不能更改數據庫並插入新的屬性,如「距離/評級」等公式。 :(對不起,我的俄語。 –

+0

如果我嘗試一些FORMUL到calc下,它會看起來像最小和最大距離的變體(我關於它的問題寫),所以這將是並不強大,因爲我看到。我沒有獲得物品的固定半徑。我通過已經觀看過的物品數量獲得物品:$ itemsWatched –

0

如果您發現您的查詢運行速度慢,這似乎是一個合理的事情在你的整個表進行復雜的計算時想到,我會建議限制了需要有自己的距離來計算的行數。確定您認爲「附近」的合理定義,並添加一個WHERE子句以減少進入該計算的行。

"WHERE 
    objLatitude BETWEEN ". 
     $lastPosition_lat - $nearby_distance 
    ." AND ". 
     $lastPosition_lat + $nearby_distance 
"AND 
    objLatitude BETWEEN ". 
     $lastPosition_long - $nearby_distance 
    ." AND ". 
     $lastPosition_long + $nearby_distance 

如果沒有什麼是矩形,這將定義中,這可能不會返回任何東西,但在那種情況下,只是沒有任何東西在附近,你可以告訴您的用戶,也可能重試運行查詢與更大的「附近距離」。

+0

我沒有固定的附近距離。 –