Формула haversine MySQL возвращает неверное расстояние, когда объединяются команды LEFT JOIN, HAVING и ORDER BY

У меня есть запрос, в котором я хотел бы получить базу данных о местонахождении пользователя (формула Haversibe), но в некоторых случаях у пользователя есть возможность сортировать данные по distance только или же с posts.time DESC,

В настоящее время я получаю данные по distance или же distance с posts.time DESC, но когда я делаю LEFT JOIN в моем запросе результаты разные и некорректные (Пожалуйста, смотрите раздел для Неверный результат).

SQLFiddle: http://sqlfiddle.com/#!9/00291/2

MySQL Query: Этот запрос включает LEFT JOIN, HAVING а также ORDER BY который, как я хочу, чтобы данные были извлечены. Однако этот запрос тянет Неверное расстояние.

SELECT
posts.id,
posts.title,
posts.location,
posts.time,
(3959
* acos(cos(radians(?))
* cos(radians(posts.latitude))
* cos(radians(posts.longitude)
- radians(?))
+ sin(radians(?))
* sin(radians(posts.latitude)))
) AS distance,
SUM(votes.value) AS votes,
MAX(CASE WHEN votes.user_id = ? THEN value END) AS uservote
FROM posts
LEFT JOIN votes
on posts.id = votes.post_id
GROUP BY posts.id
HAVING distance < ?
ORDER BY posts.time DESC
LIMIT 0, 4

Пример данных с вышеуказанным запросом в формате JSON [Пример 20-мильного радиуса]: Как видите, вторые данные неверны, потому что радиус пользователя был 20 а вторые данные distance выше пользовательского ввода.

[
{
"id": 127,
"time": "2015-08-27 23:09:59",
"distance": 0.017432013625718,
"votes": null,
"uservote": null
},
{   /*INCORRECT DATA, SHOULN'T BE PULLED*/
"id": 125,
"time": "2015-08-15 23:44:03",
"distance": 126.02295676821,
"votes": null,
"uservote": null
},
{
"id": 123,
"time": "2015-08-12 16:23:03",
"distance": 16.196330779751,
"votes": "1",
"uservote": null
}
]

Теперь здесь я объясню, что произойдет, если я изменю некоторые функции запроса, когда получу другой тип результата.

Сценарий 1

съемник LEFT JOIN И его SELECT запрос.

Удалите эти строки из основного запроса выше:

SUM(votes.value) AS votes,
MAX(CASE WHEN votes.user_id = ? THEN value END) AS uservote
LEFT JOIN votes
on posts.id = votes.post_id

Результат: Как видите, все здесь вытянуто правильно. но это не то, что я хочу, потому что мне нужны другие данные из votes Таблица.

[
{
"id": 127,
"time": "2015-08-27 23:09:59",
"distance": 0.017432013625718
},
{
"id": 124,
"time": "2015-08-12 16:23:30",
"distance": 16.409455725798
},
{
"id": 123,
"time": "2015-08-12 16:23:03",
"distance": 16.196330779751
}
]

Сценарий 2

Удалить ORDER BY posts.time DESC только из запроса. но включают LEFT JOIN И его SELECT опция в основном запросе.

Результат: Как вы можете видеть, результат теперь будет только distanceопять не завершено к тому что я хочу добиться.

[
{
"id": 114,
"time": "2015-08-06 19:25:29",
"distance": 0.017714521452369,
"votes": null,
"uservote": null
},
{
"id": 115,
"time": "2015-08-06 19:25:58",
"distance": 0.017432013625718,
"votes": "-1",
"uservote": null
},
{
"id": 116,
"time": "2015-08-06 19:26:19",
"distance": 0.017432013625718,
"votes": "1",
"uservote": null
}
]

Сценарий 3

С помощью WHERE пункт

Если я использую WHERE distance < ? до GROUPE BY Я получаю ошибка, что говорит само за себя.

Ошибка:

Неизвестный столбец «расстояние» в разделе «где»

0

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]