У меня есть запрос, в котором я хотел бы получить базу данных о местонахождении пользователя (формула 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
}
]
Теперь здесь я объясню, что произойдет, если я изменю некоторые функции запроса, когда получу другой тип результата.
съемник 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
}
]
Удалить 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
}
]
С помощью WHERE
пункт
Если я использую WHERE distance < ?
до GROUPE BY
Я получаю ошибка, что говорит само за себя.
Ошибка:
Неизвестный столбец «расстояние» в разделе «где»
Задача ещё не решена.
Других решений пока нет …