将复杂查询转换为cakephp分页条件
我允许我的用户选择一个英里半径数字和一个位置,然后我尝试返回该半径范围内的结果。网上有很多教程,其中一个似乎有完美的查询将复杂查询转换为cakephp分页条件,php,mysql,sql,cakephp,pagination,Php,Mysql,Sql,Cakephp,Pagination,我允许我的用户选择一个英里半径数字和一个位置,然后我尝试返回该半径范围内的结果。网上有很多教程,其中一个似乎有完美的查询 '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 HAVIN
'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;'
有什么想法吗
更多编辑
日志正在显示
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 < 49 LIMIT 20
选择'Job`.'id`、(3959*acos(cos(radians(37))*cos(radians(54.5972850000001))*cos(radians(-5.930119999999988)-radians(-122))+sin(radians(37))*sin(radians(54.5972850000001)),作为与'trainination'的距离。将'Job'作为'Job'左键加入'trainination'。'users'作为'User'('Job`.'User\u id`='User`.'id`)左键将'training`.'courses`作为'courseon'('Job`.'courseu id`='courses`.'id`)上的'courses`连接,其中1=1组距离小于49限制20
这看起来不错,但它现在根本没有从数据库中提取任何东西。这些选项中至少应该有9个试试这个
$this->paginate = 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 < 25 ')
);
$marker_data = $this->paginate('Marker');
$this->paginate=array('fields'=>array('id'),'(3959*acos(cos(radians(37))*cos(radians(lat))*cos(radians(lng)-radians(-122))+sin(radians(37))*sin(radians(lat)))作为距离),
“限制”=>20,
“组”=>“距离小于25”的距离)
);
$marker_data=$this->paginate('marker');
是的-但我想使用paginate函数-这是一个很好的后备计划,但我更喜欢通过pagination组件。在那里,它看起来应该可以工作,但会返回我所有的标记。我使用的是cakephp2.3,您的代码看起来与我使用的略有不同,所以我将尝试使用与2.1.1版稍有不同的版本。尝试限制10,然后你会得到什么结果?检查我的qu的编辑,我已经把我现在尝试的代码放在那里了。请注意,当我在您的代码之后检查我的sql日志时,没有任何sin-cos等,这使我认为它不能拾取新设置,因此尝试使用manualapply组的方法,而不是条件检查我编辑的答案
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 < 49 LIMIT 20
$this->paginate = 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 < 25 ')
);
$marker_data = $this->paginate('Marker');