cakephp - 如何构造此查询

时间:2014-02-21 14:23:15

标签: php mysql sql cakephp

我正在使用cakephp 2.3并尝试对查询进行分页,该查询检索特定英里范围内的所有“作业”。幸运的是,我发现了我认为我需要的查询,但是我在获取正确的数据方面遇到了问题。

修改 因此,每个“作业”记录都有一个lat和lng字段,另一个用户通过在搜索表单中输入自己的lat和lng值以及英里半径来执行搜索。在下面的代码中,下面的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;

我已经完成了这样的分页:

$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英里的范围内,但是$ job总是空的。

有人能发现我做错了吗?

2 个答案:

答案 0 :(得分:1)

试试这个来计算距离,

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

第二件事是你的连接表没有你想要获得的距离字段吗?

可以编辑您的问题并向观众表明。

答案 1 :(得分:1)

试试这个,我有同样的问题。我删除了一些(&amp;选择部分中的)

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;