PHP / Mysql - 使用临时表时的 ORDER BY
我一直在尝试使用 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 有 > 250K 个条目,我试图根据用户输入的纬度/经度将其排序到最接近的城市名称。
谢谢。
I've been trying to get this to work using ORDER BY and LIMIT, but it will output everything that was put in. The ORDER BY and LIMIT does not seem to work:
$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());
}
}
}
The table cityname has > 250K entries and I'm trying to sort it down to the closest city name based on the latitude / longitude that a user has input.
Thanks.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
这里有一个错误:
$r3 只有一个结果列(您没有给出名称)。您确定使用了正确的变量吗,因为您的代码不可能像您发布的那样工作。
另外你的变量命名真的很糟糕。使用有意义的名称而不是
$q1
、$q2
等...There's an error here:
$r3 only has one result column (which you haven't given a name). Are you sure you are using the correct variable because there's no way that your code should work as you have posted it.
Also your variable naming is really awful. Use meaningful names instead of
$q1
,$q2
, etc...请再次与 Logic 确认。 “GROUP BY distance”将从关注记录列表中返回单个记录。例如,如果 10 英里距离内有 100 个用户,您的查询将获取 10 英里内找到的第一个记录。这不会返回所有 100 条记录。
需要根据您的需求和逻辑重新设计。
Please check with Logic once again. "GROUP BY distance" will return single records from list of concern records. For e.g. if there are 100 users at 10 miles distance, your query will fetch 1st record found for 10 miles. this will NOT return all 100 records.
Need to rework with your need and logic.
答案是:
And the answer is: