2010-11-01 8 views
2

Я работаю над геолого-пространственным поиском, где я ищу близлежащие точки. Я это Haversine запрос будучи набегать в таблице:Выбор уникальных записей

SELECT 
uid, adrLat, adrLng, 
round(3956 * 2 * ASIN(SQRT(POWER(SIN((39.97780609 - abs(adrLat)) * pi()/180/2), 2) + COS(39.97780609 * pi()/180) * COS(abs(adrLat) * pi()/180) * POWER(SIN((-105.25861359 - adrLng) * pi()/180/2), 2))), 2) AS distance 
FROM dataPoints 
WHERE adrLng BETWEEN -105.2680699902 AND -105.2491571898 
AND adrLat BETWEEN 39.970559713188 AND 39.985052466812 
HAVING distance <= 0.30 and distance > 0.00 
ORDER BY distance; 

Это дало бы мне результат так же, как это:

+-----+-------------+---------------+----------+ 
| uid | adrLat  | adrLng  | distance | 
+-----+-------------+---------------+----------+ 
| 191 | 39.97764587 | -105.25627136 |  0.12 | 
| 520 | 39.97746658 | -105.25627136 |  0.13 | 
| 265 | 39.97560120 | -105.25814056 |  0.15 | 
| 266 | 39.97560120 | -105.25814056 |  0.15 | 
| 274 | 39.97710037 | -105.25589752 |  0.15 | 
| 98 | 39.97764969 | -105.26172638 |  0.17 | 
| 576 | 39.97967911 | -105.25613403 |  0.18 | 
| 575 | 39.97967911 | -105.25613403 |  0.18 | 
| 469 | 39.97895813 | -105.25386810 |  0.26 | 
| 470 | 39.97895813 | -105.25386810 |  0.26 | 
| 1 | 39.98003006 | -105.25471497 |  0.26 | 
| 383 | 39.97621155 | -105.26350403 |  0.28 | 
| 431 | 39.97459793 | -105.25507355 |  0.29 | 
| 430 | 39.97459793 | -105.25507355 |  0.29 | 
| 429 | 39.97459793 | -105.25507355 |  0.29 | 
| 428 | 39.97459793 | -105.25507355 |  0.29 | 
+-----+-------------+---------------+----------+ 

Однако, как вы, вероятно, может сказать, некоторые записи дублируются в таблице (таким образом данные мне предоставлены, и я должен сохранить их таким образом.) 265: 266, 576: 575, 469: 470 и 431-428 - все дубликаты.

Есть ли способ изменить запрос, чтобы выбрать уникальные записи? Похоже, мне приходится сопоставлять adrLat и adrLng, чтобы отфильтровать дубликаты, но я не уверен, могу ли я сделать все это в рамках одного и того же запроса или если мне нужно выполнить некоторую пост-обработку результата.

+0

Есть ли причина, по которой вы не используете функции 'ПРОСТРАНСТВЕННЫЙ' (и индексы)? – Quassnoi

+0

Да, когда этот проект начался, ни я, ни другой разработчик ничего не знали о пространственной поддержке MySQL. И кодирование формулы Хаверсина было без проблем. Возможно, следующий проект ... – KirAsh4

ответ

3
SELECT adrLat, adrLng, 
     round(3956 * 2 * ASIN(SQRT(POWER(SIN((39.97780609 - abs(adrLat)) * pi()/180/2), 2) + COS(39.97780609 * pi()/180) * COS(abs(adrLat) * pi()/180) * POWER(SIN((-105.25861359 - adrLng) * pi()/180/2), 2))), 2) AS distance 
FROM mytable 
WHERE adrLng BETWEEN -105.2680699902 AND -105.2491571898 
     AND adrLat BETWEEN 39.970559713188 AND 39.985052466812 
GROUP BY 
     adrLat, adrLng 
HAVING distance <= 0.30 
     AND distance > 0.00 
ORDER BY 
     distance 
+0

Бинго, это сделал. Я положил предложение GROUP BY в конце или прямо перед ORDER BY, и это, очевидно, потерпело неудачу. Огромное спасибо! – KirAsh4

3
SELECT DISTINCT colum_name FROM table 

Ключевое слово SELECT позволяет нам захватывать всю информацию из столбца (или столбцов) таблицы. Это, конечно, обязательно означает, что будут увольнения. Что делать, если мы хотим только выбрать каждый элемент DISTINCT? Это легко сделать в SQL. Все, что нам нужно сделать, это добавить DISTINCT после SELECT. Синтаксис выглядит следующим образом:

+0

Это один столбец. Мне все еще нужны все четыре столбца с уникальными записями. – KirAsh4

0

мне еще нужно все четыре колонки вернулся

Вы уже получили уникальные данные там (например, UID 576 и 575 возвращают те же координаты - но UID очевидно, отличается).

Ваше определение «уникальное», очевидно, отличается от нашего - можете ли вы представить пример того, что вы ожидаете увидеть?

+0

Игнорировать UID. Я имел в виду уникальность с adrLat и adrLng. Как вы указали, 576 и 575 - одни и те же координаты, только разные UID. Я не забочусь о UID, мне не нужны две (или более) точки с одинаковыми координатами. – KirAsh4

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