У меня большая база данных mysql, и я хочу отклонить все строки, которые не входят в диапазон желаемого радиуса.
$results_per_page = 10;
$city = "London";
$radius = 20;
запрос mysql:
if ($city != "") {
$sql = "SELECT * FROM city_items ORDER BY id ASC LIMIT " . $page_first_result . "," . $results_per_page;
find_all_in_radius($con, $sql, $city, $radius);
}
else {
$sql = "SELECT * FROM city_items ORDER BY id ASC LIMIT " . $page_first_result . "," . $results_per_page;
find_all($con, $sql);
}
function find_all_in_radius($con, $sql, $city, $radius) {
$result1 = mysqli_query($con, $sql);
#geo_code find coordinates of provided city
$long_lat = geo_code($city);
echo '<div id = "container">';
$good_rows = array();
while($row = mysqli_fetch_array($result1))
{
$latitude = doubleval($long_lat[0]);
$longitude = doubleval($long_lat[1]);
$latit = doubleval($row[106]);
$longtit = doubleval($row[107]);
#distance() is function counting range between two coordinates
if (!empty($latit) and !empty($longtit) and distance($latit, $longtit, $latitude, $longitude, "M") < $radius)
{
array_push($good_rows, $row);
}
}
foreach($good_rows as $row) {
echo $row[1];
echo $row[2];
}
}
Итак, проблема в том, что если $ city и $ radius пусты, я получаю 100 элементов на 10 страницах. Если установлены $ city и $ radius, я получаю 10 элементов, но один - это одна вторая страница, два - на четвертой странице. Некоторые строки пусты. Без:
"ASC LIMIT " . $page_first_result . "," . $results_per_page;"
в mysql_query все в порядке, но я получаю все результаты на первой странице, без какой-либо работы с разбивкой на страницы.
Обновлено: Я ищу какой-то волшебный трюк, который позволит мне запустить функцию php distance () в запросе mysql ... или обойти строки, которые не соответствуют требованиям, в функции find_all_in_radius (), не разрушая мою разбивку на страницы: D






Нет никакого волшебного трюка. Или вы
В первом подходе вы должны реализовать свою функцию distance в MySQL. Это может быть проще, чем вы думаете. Если вы используете стандартное расстояние по дуге, вы можете скопировать код из MySQL Great Circle Distance (формула Хаверсина)
Если вы выберете второй подход, вам нужно будет получить все строки, чтобы сохранить количество совпадающих строк.
В любом случае вы столкнетесь с проблемами производительности, если у вас действительно большая база данных (миллионы строк).
Я решил это вчера с помощью array_slice (), в любом случае спасибо
Вы получаете все результаты, отсортированные по страницам, а затем фильтруете их по городу и радиусу. Таким образом, любые оставшиеся результаты остаются на исходной странице. Вам нужно сначала отфильтровать, а затем расположить их по страницам.