我的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为空,我将在10页上获得100个项目。 如果设置了$ city和$ radius,我得到10个项目,但一个是第二页,第二个是第四页。有些行是空白的。 没有:
"ASC LIMIT " . $page_first_result . "," . $results_per_page;"
在mysql_query中,一切都很好,但是我在第一页上获得了所有结果,而没有任何分页功能。
编辑:我正在寻找一些魔术,这将允许我在mysql查询中运行php函数distance()或绕过find_all_in_radius()函数中不符合条件的行,而不会破坏我的分页:D
答案 0 :(得分:1)
没有魔术。要么
在第一种方法中,您必须在MySQL中实现distance
函数。那可能比您想的要容易。如果您使用的是标准大圆距,则可以从MySQL Great Circle Distance (Haversine formula)
如果采用第二种方法,则必须获取所有行并保留匹配行的计数。
无论哪种情况,如果您确实有一个大数据库(数百万行),都会遇到性能问题。