2014-02-21 25 views
1

我使用cakephp 2.3並試圖分頁查詢檢索所有我的'工作'在一定的英里半徑範圍內。幸運的是,我發現我認爲我需要的查詢,但是我有問題想要獲取正確的數據。cakephp - 如何構造這個查詢

編輯 所以每個「工作」,記錄有一個緯度和經度字段,另一個用戶通過在搜索表單中輸入自己的經緯度和lng值以及一英里範圍內的搜索。在下面的代碼中,我的paginator中的php變量$ lat $ lng和$ miles是用戶輸入的搜索參數。

查詢,我發現這裏https://developers.google.com/maps/articles/phpsqlsearch_v3?hl=el-GR - 應該是這樣的:

 
    SELECT id, 
      (3959 * acos(cos(radians(37)) * cos(radians(lat)) * cos(radians(lng) - radians(-122)) + sin(radians(37)) * sin(radians(lat)))) AS distance 
     FROM markers 
    HAVING distance < 25 
    ORDER BY distance LIMIT 0 , 20; 

,我已經得到了通過我的PAGINATE會像這樣:

$this->Paginator->settings = array(
           'fields'=>array('id','(3959 * acos(cos(radians(37)) * cos(radians('.$lat.')) * cos(radians('.$lng.') - radians(-122)) + sin(radians(37)) * sin(radians('.$lat.')))) AS distance '), 
           'limit' => 20, 
           'group'=>'distance having distance < '.$miles 
             ); 
$jobs = $this->Paginator->paginate('Job'); 

,併產生看起來SQL像:

SELECT `Job`.`id`, (3959 * acos(cos(radians(37)) * cos(radians(54.59728500000001)) * cos(radians(-5.930119999999988) - radians(-122)) + sin(radians(37)) * sin(radians(54.59728500000001)))) AS distance FROM `trainnation`.`jobs` AS `Job` LEFT JOIN `trainnation`.`users` AS `User` ON (`Job`.`user_id` = `User`.`id`) LEFT JOIN `trainnation`.`courses` AS `Course` ON (`Job`.`course_id` = `Course`.`id`) WHERE 1 = 1 GROUP BY distance having distance < 100 LIMIT 20 

這看起來是正確的,但沒有拉任何信息。應該至少有9條記錄在距離該位置100英里的範圍內,但$工作總是空的。

任何人都可以發現我做錯了什麼嗎?

+0

您是否嘗試過直接從您的MySQL工作臺或PhpMyAdmin或cli運行創建的查詢?如果是這樣,它說什麼? – Jelmer

回答

1

試試這個來計算距離,

$distance = (3959 * acos(cos(deg2rad(37)) * cos(deg2rad(54.59728500000001)) * cos(deg2rad(-5.930119999999988) - deg2rad(-122)) + sin(deg2rad(37)) * sin(deg2rad(54.59728500000001)))); 

第二件事情是你的連接表沒有距離場到你正在嘗試獲得?

可能是編輯你的問題,並向觀衆說清楚。

+0

嗨Anubhav,謝謝你的迴應。我編輯了我的曲目,使其更清晰。距離是用戶作爲搜索的一部分輸入的 –

1

試試這個,我有同樣的問題。我在選擇部分刪除了一些( & )

SELECT id, 3959 * acos(cos(radians(37)) * cos(radians(lat)) * cos(radians(lng) - radians(-122)) + sin(radians(37)) * sin(radians(lat))) AS distance 
FROM markers 
HAVING distance < 25 
ORDER BY distance LIMIT 0 , 20;