我有一个请求(在PHP代码中):
$sql =
"SELECT id_, name_, status, starsCount, photoFilename, "
. "( 3959 * acos( cos( radians('$lastPosition_lat') ) *
cos( radians( objLatitude ) ) *
cos( radians( objLongitude ) -
radians('$lastPosition_long') ) + "
. "sin( radians('$lastPosition_lat') ) *
sin( radians( objLatitude ) ) ) )
AS distance
FROM markets "
. "ORDER BY distance ASC, starsCount DESC "
. "LIMIT $itemsWatched,15";
我需要按照评级(1到5之间的星级)对附近的市场进行排序。
或者,我可以将当前用户的最小和最大范围提供给另一部分市场,并在第二个查询中按评级排序。但我认为,这种方式会很慢。
您可以通过快速查询帮助我获取按距离和评级排序的市场列表吗?
答案 0 :(得分:0)
如果我的问题正确,您可以随时限制距离(距离
答案 1 :(得分:0)
如果您发现查询运行缓慢,这对整个表执行复杂计算似乎是合理的事情,我建议限制需要计算距离的行数。确定你所考虑的合理定义"附近",并添加一个WHERE子句来减少进行该计算的行。
"WHERE
objLatitude BETWEEN ".
$lastPosition_lat - $nearby_distance
." AND ".
$lastPosition_lat + $nearby_distance
"AND
objLatitude BETWEEN ".
$lastPosition_long - $nearby_distance
." AND ".
$lastPosition_long + $nearby_distance
如果这将定义的矩形内没有任何内容,这可能不会返回任何内容,但在这种情况下,附近没有任何内容,您可以告诉您的用户,或者尝试再次运行查询更大的"附近距离"。
答案 2 :(得分:0)
谢谢大家。我重拍了自己的想法并自己找到答案。
$sql =
"SELECT MIN(
( 3959 * acos( cos( radians('$lastPosition_lat') ) *
cos( radians( objLatitude ) ) *
cos( radians( objLongitude) -
radians('$lastPosition_long') ) +
sin( radians('$lastPosition_lat') ) *
sin( radians( objLatitude ) ) ) ))
AS minDistance,
MAX( 3959 * acos( cos( radians('$lastPosition_lat') ) *
cos( radians( objLatitude ) ) *
cos( radians( objLongitude) -
radians('$lastPosition_long') ) +
sin( radians('$lastPosition_lat') ) *
sin( radians( objLatitude ) ) ) )
AS maxDistance
FROM markets
LIMIT $itemsWatched,15";
$query = $mysqli->query($sql);
$resQ = mysqli_fetch_row($query);
$minDis = "0";
$maxDis = "0";
if ($resQ){
$minDis = $resQ[0];
$maxDis = $resQ[1];
}
$sql =
"SELECT id_, name_, status, starsCount, photoFilename, "
. "( 3959 * acos( cos( radians('$lastPosition_lat') ) *
cos( radians( objLatitude ) ) *
cos( radians( objLongitude ) -
radians('$lastPosition_long') ) + "
. "sin( radians('$lastPosition_lat') ) *
sin( radians( objLatitude ) ) ) )
AS distance
FROM markets "
. "HAVING distance BETWEEN '$minDis' AND '$maxDis' "
. "ORDER BY starsCount DESC "
. "LIMIT $itemsWatched,15";
现在它完美无缺。 我们所做的?例如,我们从数据库(LIMIT)获得项目10-25,计算该部分的电话(用户)的MIN和MAX距离。因此,用户总是首先看到具有最佳评级(受欢迎程度)的市场,当他们自己与市场的距离过时(每15个市场用户首先看到具有最佳评级的市场)。 希望这可以帮助那些希望动态按距离和评级对对象进行排序的人!