将这两个MySQL查询合并为一个

时间:2013-04-06 08:39:33

标签: php mysql sql distance

我向你解释这个问题。我有两个表:“列表”,其中包含我的所有列表,其中包含不同的信息,特别是一个城市ID。我有第二个表“城市”,其中包含我所有国家的所有城市的完整列表,其中包含许多信息:纬度,经度,城市名称等。

我想显示按实际点(地理位置,我有纬度/经度)与列表中的城市之间的距离排序的所有列表。

Actualy,我用2个MySQL查询执行此操作,并且它可以工作:

$formula = "(6366*acos(cos(radians($latitude))*cos(radians(`latitude`))*cos(radians(`longitude`) -radians($longitude))+sin(radians($latitude))*sin(radians(`latitude`))))";

        $q = "SELECT *,$formula AS dist FROM ".$this->db_city." WHERE $formula<='$distance' ORDER by dist ASC";
        $q = $this->db->query($q);
$resultSQL = $q->result_array();

这一个:

if ($localization != ''){
            if ($whereClause == ''){
                //$whereClause .= ' WHERE address_city LIKE "'.$localization.'"';
                $loc = '';
                foreach ($localization as $key => $value) {
                    if ($loc == ''){
                        $loc .= '"'.$value.'"';
                    }else{
                        $loc .= ', "'.$value.'"';
                    }
                }
                $whereClause .= ' WHERE address_city IN ('.$loc.')';
            }else{
                //$whereClause .= ' && address_city LIKE "'.$localization.'"';
                $loc = '';
                foreach ($localization as $key => $value) {
                    if ($loc == ''){
                        $loc .= '"'.$value.'"';
                    }else{
                        $loc .= ', "'.$value.'"';
                    }
                }
                $whereClause .= ' && address_city IN ('.$loc.')';
            }
        }

        $q = "SELECT * FROM ".$this->db_listing.$whereClause." ORDER BY created_stamp DESC";

这是有效的,但问题是我没有在第二个查询中访问“dist”参数,所以我无法通过dist命令。解决方案是将第一个大查询(具有公式的查询)与第二个查询合并。

我尝试使用LEFT JOIN,但它没有用。你能帮我吗 ?谢谢!

1 个答案:

答案 0 :(得分:0)

试试这个,它会让你回到距所提供的经度和纬度半径为距离的所有城市。

"SELECT *,(((acos(sin(($latitude*pi()/180)) * sin((`latitude`*pi()/180))+cos(($latitude*pi()/180)) * cos((`Latitude`*pi()/180)) * cos((($longitude- 
    `longitude`)*pi()/180))))*180/pi())*60*1.1515) AS distance FROM location WHERE (((acos(sin(($latitude*pi()/180)) * sin((`latitude`*pi()/180))+cos(($latitude*pi()/180)) * cos((`Latitude`*pi()/180)) * cos((($longitude- 
    `longitude`)*pi()/180))))*180/pi())*60*1.1515) <= $distance"

感谢。