MySQL: 如何按等级和距离排序?
MySQL: How to order by rating and distance?
我有一个请求(在 PHP-code):
$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 之间的星级)对附近的市场进行排序。
或者,我可以获得当前用户到另一部分市场的最小和最大范围,并在第二个查询中按评级排序。但我认为,这种方式会很慢。
你能帮我通过快速查询获得按距离和评级排序的市场列表吗?
如果我答对了你的问题,你总是可以限制距离(距离 < X 公里)并制定一个简单的公式来计算 rating/distance 比率,在这种情况下,你想显示高收视率,附近第一?您将有一个公式,例如:距离/评级,顺序升序。
如果您发现查询运行缓慢,这似乎是对整个 table 执行复杂计算时的合理预期,我建议限制需要具有距离的行数计算。确定您考虑的合理定义 "nearby",并添加 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
如果这将定义的矩形内没有任何东西,这可能不会 return 任何东西,但在这种情况下,附近没有任何东西,您可以告诉您的用户,或者尝试 运行 用更大的 "nearby distance".
再次查询
谢谢大家。我正在改造我的想法并自己找到答案。
$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,计算这部分与 phone(user) 的 MIN 和 MAX 距离。因此,用户总是首先看到评级最高(受欢迎程度)的市场,而这与他们自己与市场的距离有关(每 15 个市场用户首先看到评级最高的市场)。
希望这对想要按距离和等级对对象进行动态排序的人有所帮助!
我有一个请求(在 PHP-code):
$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 之间的星级)对附近的市场进行排序。
或者,我可以获得当前用户到另一部分市场的最小和最大范围,并在第二个查询中按评级排序。但我认为,这种方式会很慢。
你能帮我通过快速查询获得按距离和评级排序的市场列表吗?
如果我答对了你的问题,你总是可以限制距离(距离 < X 公里)并制定一个简单的公式来计算 rating/distance 比率,在这种情况下,你想显示高收视率,附近第一?您将有一个公式,例如:距离/评级,顺序升序。
如果您发现查询运行缓慢,这似乎是对整个 table 执行复杂计算时的合理预期,我建议限制需要具有距离的行数计算。确定您考虑的合理定义 "nearby",并添加 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
如果这将定义的矩形内没有任何东西,这可能不会 return 任何东西,但在这种情况下,附近没有任何东西,您可以告诉您的用户,或者尝试 运行 用更大的 "nearby distance".
再次查询谢谢大家。我正在改造我的想法并自己找到答案。
$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,计算这部分与 phone(user) 的 MIN 和 MAX 距离。因此,用户总是首先看到评级最高(受欢迎程度)的市场,而这与他们自己与市场的距离有关(每 15 个市场用户首先看到评级最高的市场)。 希望这对想要按距离和等级对对象进行动态排序的人有所帮助!