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 个市场用户首先看到评级最高的市场)。 希望这对想要按距离和等级对对象进行动态排序的人有所帮助!