2017-07-25 40 views
1

私は2つのデータベーステーブルquotationsgaragを持っています。どちらの表にもlat、lngフィールドがあります。コーディングインターン:2つのパラメータに基づいて2つのテーブルを結合する

特定の半径に基づいて近くのガレージに見積もりを提示する必要があります。私は

私はCIで次のクエリを使用して、近くのガレージを取得することができ相場表から、緯度LNGをを取ると、緯度でガレージテーブルのLNGそれを一致させる必要があり、このため

$sql = "SELECT *, (3959 * acos(cos(radians(" . $lat . ")) * cos(radians(lat)) * cos(radians(lng) - radians(" . $lng . ")) + sin(radians(" . $lat . ")) * sin(radians(lat)))) AS distance FROM garage HAVING distance < 25"; 
$result = $this->db->query($sql) ; 

しかし、私は緯度要求された見積書とそれに関連行う方法がわからない、LNG

は、あなたがそれで私を助けてくださいすることができ

答えて

0
SELECT 
    Q.* 
FROM garage g 
LEFT JOIN quotes q 
ON SQRT(SQUARE(ABS(q.lat - g.lat)) + SQUARE(ABS(q.lng - g.lng))) <= @MaxDistanceInDegrees 
WHERE g.id = @GarageID 

これは動作するはずです。大きなデータベースがある場合、この問題はかなり複雑になり、n^2の問題を軽減するために、ある種のグリッドシステムを作成する必要があります。

0

私は自分の側でこのクエリをテストしていませんが、あなたが望む結果を達成するのに役立つと思います。私はここに2つのテクニックを追加しています。

$query = $this->db 
    ->select('*') // Add your require column name as you want 
    ->from('garage as g') 
    ->join('distance as d1', 'd1.lat = g.lat', 'left outer') 
    ->join('distance as d2', 'd2.lng = g.lng', 'left outer')    
    //->where('g.column', $variable) 
    ->get(); 

// OR Try this way using and 
->join('distance as d1', 'd1.lat = g.lat AND d1.lng = g.lng'); 
関連する問題