2013-04-06 2 views
1

Я объясню вам эту проблему. У меня есть две таблицы: «листинг», который содержит все мои списки с различной информацией и особенно один: идентификатор города. У меня есть второй стол «город», который содержит полный список всех городов моих стран со многими сведениями: широта, долгота, название города и т. Д.Объедините эти 2 запроса MySQL в один

Я хочу показать все данные, упорядоченные по расстоянию между фактической точкой , У меня есть lat/lng) и города в таблице листинга.

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, но это не сработало. Не могли бы вы мне помочь ? Благодаря !

ответ

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" 

Спасибо.

+0

Хммм спасибо, но он просто делает то же самое, что и первый запрос. Он работает, но я хочу иметь это значение «dist», доступное во втором запросе. Тот, кто получает мой листинг. – jackson

+0

@jackson: кажется, вы забыли поместить имя таблицы в свой второй запрос, $ this-> db_listing. $ WhereClause начал с того, где предложение опускает имя таблицы, можете ли вы разместить имя таблицы? поделиться с вами структурой данных Я поправлю вас. –

+0

Таблица "Список" ID, LISTING_NAME, город Table "город" ID, широчайшие, LNG, city_name Так во всем мире, я хотел бы сделать: SELECT * FROM листинг ORDER BY дист Но, в "Dist" поле генерируется первым запросом, а не вторым. – jackson

Смежные вопросы