MySQL:如何通过评级和距离订购?

时间:2017-01-10 20:58:52

标签: php mysql sql

我有一个请求(在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之间的星级)对附近的市场进行排序。

或者,我可以将当​​前用户的最小和最大范围提供给另一部分市场,并在第二个查询中按评级排序。但我认为,这种方式会很慢。

您可以通过快速查询帮助我获取按距离和评级排序的市场列表吗?

3 个答案:

答案 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个市场用户首先看到具有最佳评级的市场)。 希望这可以帮助那些希望动态按距离和评级对对象进行排序的人!