2013-11-16 3 views
0

Я не могу решить эту проблему:MySQL-combinie два запроса

У меня есть mysql DB со многими геокоординированными координатами.

Мне понравилось, какие точки находятся в пределах определенного количества миль от конкретных координат И Которые находятся в пределах определенной площади.

Очки в пределах определенной области:

(SELECT 
     *, 
     'area' as type, 
     (3959 * acos(cos(radians(".$Plat.")) * cos(radians(lat)) * cos(radians(lng) - radians(".$Plng.")) + sin(radians(".$lat.")) * sin(radians(lat)))) AS distance 
    FROM 
     ".$db." 
    HAVING 
     distance < ".$radius." 

точки в пределах определенной площади:

SELECT 
     *, 
     'square' as type, 
     -1 AS distance 

    FROM 
     ".$db." 
    WHERE 
     ((Alat <= ".$Alat." AND ".$Alat." <= Blat) OR (Alat >= ".$Alat." AND ".$Alat." >= Blat)) AND 
     ((Alng <= ".$Alng." AND ".$Alng." <= Blng) OR (Alng >= ".$Alng." AND ".$Alng." >= Blng)) 
     ... 

Я использую UNION, чтобы объединить оба запроса, но дело в том, «тип» и «расстояние» имеет разный значения. Таким образом, я дважды искал точку поиска. Мне нравилось иметь все, что только раз.

Но я понятия не имею, как с этим справиться.

Edit:

Для обзора я взял лишь некоторые из данных.

В результате я получаю что-то вроде этого:

+------+-----------+-----------+----------+-------------+ 
| id | Alat  | Alng  | distance | type  | 
+------+-----------+-----------+----------+-------------+ 
| 42 | 53.704678 | 10.202164 | 12345 | area 
+------+-----------+-----------+------------------------+ 
| 72 | 23.704678 | 15.202164 | 12345 | area 
+------+-----------+-----------+------------------------+ 
      ...... 
+------+-----------+-----------+------------------------+ 
| 42 | 53.704678 | 10.202164 | -1  | square 
+------+-----------+-----------+------------------------+ 
| 81 | 43.778 | 15.201212 | -1  | square 
+------+-----------+-----------+------------------------+ 
      ...... 
  • идентификатор (72) существует только в области не на площади.
  • id (81) существует только на площади, а не в этом районе.
  • id (42) находится в этом районе и на площади. Так выглядит два раза. Но это нужно только один раз. Область должна стать приоритетной.

но это просто должно быть

+------+-----------+-----------+----------+-------------+ 
| id | Alat  | Alng  | distance | type  | 
+------+-----------+-----------+----------+-------------+ 
| 42 | 53.704678 | 10.202164 | 12345 | area 
+------+-----------+-----------+------------------------+ 
| 72 | 23.704678 | 15.202164 | 12345 | area 
+------+-----------+-----------+------------------------+ 
      ...... 
+------+-----------+-----------+------------------------+ 
| 81 | 43.778 | 15.201212 | -1  | square 
+------+-----------+-----------+------------------------+ 
      ...... 
+1

Пожалуйста, предоставьте данные образца и ожидаемый результат как в табличной форме. –

ответ

0

Использование GROUP BY после UNION для удаления дубликатов.

SELECT id, Alat, Alng, distance, type 
FROM (
    SELECT *, 'area' as type, ... FROM ... 
UNION ALL 
    SELECT *, 'square' as type, ... FROM ... 
) AS subq 
GROUP BY id, Alat, Alng, distance 

Это может быть не очень эффективно с большими наборами результатов, но должно работать.

Обратите внимание, что такой тип GROUP BY запрещен в стандарте SQL и многих других базах данных (поскольку type не находится в GROUP BY), но MySQL это позволяет.

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