0

地理座標に基づいて距離を生成する mysql クエリを php で作成しようとしていますが、クエリはテーブルの最初の sid 行からデータを複製し続けます。呼び出された sid を持つ各行の結果を生成するクエリを取得するにはどうすればよいですか?

ジオ テーブル:

フィッド | シド | 緯度 | 経度

887 | 696 | 38.62774 | -90.199514

823 | 696 | 38.63979 | -90.02946

887 | 693 | 38.62774 | -90.199514

823 | 693 | 38.59430 | -90.260372

クエリ結果:

フィッド | シド | 距離

887 | 696 | 0.05

887 | 696 | 0.05

887 | 693 | 0.05

887 | 693 | 0.05

望ましいクエリ結果:

フィッド | シド | 距離

887 | 696 | 0.05

823 | 696 | 3.10

887 | 693 | 0.05

823 | 693 | 12.02

PHP クエリ:

public function ListEntry( &$data ){

    $task = SPRequest::string('task', null );
    if (strtolower($task)!="search.results")
        return ;

    $session = JFactory::getSession();
    $ref_lat = $session->get('mj_rs_ref_lat', null);
    $ref_lng = $session->get('mj_rs_ref_lng', null);
    $ref_loc = $session->get('mj_rs_center_selector', null);
    $ref_dis = $session->get('mj_rs_ref_dist', null);
    if (!$ref_lat OR !$ref_lng)
        return ;

    $km     = $this->_getKm() ;
    $id     = $data['id'] ;
    $db     =& JFactory::getDBO();

    $query = " SELECT GEO.fid, GEO.sid, ";
    $query.= " ({$km}*acos(cos(radians({$ref_lat}))*cos(radians(GEO.latitude))*cos(radians(GEO.longitude)-radians({$ref_lng}))+sin(radians({$ref_lat}))*sin(radians(GEO.latitude)))) AS distance ";
    $query.= " FROM `#__field_geo` AS GEO  ";
    $query.= " WHERE  GEO.sid = {$id} ";
    $query.= " ORDER BY distance ASC ";
    $query.= " LIMIT 1 ";

    $db->setQuery($query);
    $distances = $db->loadAssoc();
    $fidgeo = $distances['fid'];
            $later = $distances['sid'];
    $distance = $distances['distance'];



    }

ご協力ありがとうございました!

4

2 に答える 2

0

GROUP BY fid (および WHERE の代わりに HAVING ) を使用してみてください。mysql は結果テーブルを再度読み取らないため、個別の方が適しています。

于 2013-11-14T09:06:34.983 に答える