我一直在尝试使用ORDER BY和LIMIT来使用它,但是它会输出所有放入的内容.ORDER BY和LIMIT似乎不起作用:
$lat1 = 37.349418;
$lon1 = -121.896286;
$distance = 25;
$q = "SELECT * FROM cityname WHERE feature_class = 'A' OR feature_class = 'P'";
$r = mysql_query($q) or die(mysql_error());
while ($row = mysql_fetch_array($r)) {
$lat = trim($row["latitude"]);
$lon = trim($row["longitude"]);
$name = $row["name"];
$pop = $row["population"];
$miles = distance($lat, $lon, $lat1, $lon1, "m");
$milesrounded = round($miles, 2);
if ($miles < $distance) {
if ($pop > 0) {
$q2 = "CREATE TEMPORARY TABLE IF NOT EXISTS `templocation4` (
`cityname` varchar(75) NOT NULL,
`distance` double NOT NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1";
$r2 = mysql_query($q2) or die(mysql_error());
$q1 = "INSERT INTO templocation4 (cityname, distance) VALUES ('$name', '$milesrounded')";
$r1 = mysql_query($q1) or die(mysql_error());
$q3 = "SELECT MIN(distance) FROM templocation4 GROUP BY distance DESC LIMIT 10";
$r3 = mysql_query($q3) or die(mysql_error());
while ($row1 = mysql_fetch_array($r3)) {
echo $row1["cityname"];
echo " ";
echo $row1["distance"];
echo "<br>";
}
$q5 = "DROP TABLE templocation4";
$r5 = mysql_query($q5) or die(mysql_error());
}
}
}
表cityname有&gt; 250K条目,我正在尝试根据用户输入的纬度/经度将其排序到最近的城市名称。
感谢。
答案 0 :(得分:0)
这里有一个错误:
$q3 = "SELECT MIN(distance) FROM templocation4 GROUP BY distance DESC LIMIT 10";
$r3 = mysql_query($q3) or die(mysql_error());
while ($row1 = mysql_fetch_array($r3)) {
echo $row1["cityname"]; // Where is cityname defined???
echo " ";
echo $row1["distance"]; // Where is distance defined???
echo "<br>";
}
$ r3只有一个结果列(您没有给出名称)。您确定使用的是正确的变量,因为您的代码无法按照发布的方式运行。
此外,您的变量命名非常糟糕。使用有意义的名称而不是$q1
,$q2
等...
答案 1 :(得分:0)
请再次检查Logic。 “GROUP BY distance”将从关注记录列表中返回单个记录。对于例如如果距离10英里有100个用户,则您的查询将获取10英里内找到的第一条记录。这不会返回所有100条记录。
$q1 = "INSERT INTO templocation4 (cityname, distance) VALUES ('$name', '$milesrounded')";
$r1 = mysql_query($q1) or die(mysql_error());
$q3 = "SELECT MIN(distance) FROM templocation4 GROUP BY distance DESC LIMIT 10";
$r3 = mysql_query($q3) or die(mysql_error());
需要根据您的需要和逻辑进行修改。
答案 2 :(得分:0)
//determine distance function
function distance($lat, $lon, $lat1, $lon1, $unit) {
$theta = $lon - $lon1;
$dist = sin(deg2rad($lat)) * sin(deg2rad($lat1)) + cos(deg2rad($lat)) * cos(deg2rad($lat1)) * cos(deg2rad($theta));
$dist = acos($dist);
$dist = rad2deg($dist);
$miles = $dist * 60 * 1.1515;
$unit = strtoupper($unit);
if ($unit == "K") {
return ($miles * 1.609344);
} else if ($unit == "N") {
return ($miles * 0.8684);
} else {
return $miles;
}
}
//sample latitude for testing purposes
$lat1 = 37.349418;
//sample longitude for testing purposes
$lon1 = -121.896286;
//sample distance for testing purposes
$distance = 25;
//query to select only a or p feature class
$query = "SELECT * FROM cityname WHERE feature_class = 'A' OR feature_class = 'P'";
$result = mysql_query($query) or die(mysql_error());
//create the temporary table - if it does not exist
$createtemporarytablequery = "CREATE TEMPORARY TABLE IF NOT EXISTS `templocation4` (
`cityname` varchar(75) NOT NULL,
`distance` double NOT NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1";
$resultofcreatetemporarytablequery = mysql_query($createtemporarytablequery) or die(mysql_error());
while ($row = mysql_fetch_array($result)) {
//gets latitude of city in database
$lat = trim($row["latitude"]);
//gets longitude of city in database
$lon = trim($row["longitude"]);
//gets cityname
$name = $row["name"];
//gets population of aforementioned cityname
$pop = $row["population"];
//determines distance from sample latitude and longitude from the latitude and longitude of cities in the cityname database
$miles = distance($lat, $lon, $lat1, $lon1, "m");
//round the miles to the 2nd decimal place
$milesrounded = round($miles, 2);
//determine if the city meets the request
if ($miles < $distance) {
//make sure its a populated city
if ($pop > 0) {
//insert stuff into temporary table
$insertstuffintotemporarytable = "INSERT INTO templocation4 (cityname, distance) VALUES ('$name', '$milesrounded')";
$resultofinsertstuffintotemporarytable = mysql_query($insertstuffintotemporarytable) or die(mysql_error());
}
}
}
//retrieve the closest 10 cities from the temporary table
$retrieve10closestcities = "SELECT * FROM templocation4 GROUP BY distance ASC LIMIT 10";
$resultofretrieving10closestcities = mysql_query($retrieve10closestcities) or die(mysql_error());
//determine how many results there are
$numrows = mysql_num_rows($resultofretrieving10closestcities);
//are there more than 0 results?
if ($numrows > 0) {
//loops through array
while ($row1 = mysql_fetch_array($resultofretrieving10closestcities)) {
echo $row1["cityname"];
echo " ";
echo $row1["distance"];
echo "<br>";
}
} else {
//echos no results found
echo "No results found";
}
//drop temporary table
$droptable = "DROP TABLE templocation4";
$resultofdroptable = mysql_query($droptable) or die(mysql_error());
答案是:
San Jose 0.7
Buena Vista 2.24
Burbank 2.65
Santa Clara 3.25
Fruitdale 3.33
Alum Rock 3.97
East Foothills 4.85
Campbell 5.21
Seven Trees 5.41
Milpitas 5.48