2016-10-16 28 views
2

私は3つのテーブルを持っています。特定の場所の最も近い場所からドライバーを見つける

表1 - ドライバ

Table 1 - drivers

表2 - 位置

Table 2 - location

表3 - 距離

enter image description here

ユーザーは、場所に一致するドライバを検索します。ドライバテーブルでは、位置はドライバの現在の位置を参照します。ドライバが特定の場所で利用できない場合は、ユーザーが提供している場所に最も近いドライバを検索するクエリが必要です。

表2はロケーション名であり、表3はある場所から別の場所までの距離です。しかし、問題は、もしlocationid1からlocationid2までの距離が格納されていれば、反対のバージョンは(locationid2からlocationid1へ)ではありません。

+1

そのような質問を書いてください。楽しさと喜びのように聞こえる。 – Drew

+1

実際には、距離はダッカの「時間」によって測定されます。 (:p)。あなたが試したことを示すとともに、サンプル入力に基づいて期待される結果を共有してください。 – 1000111

+0

ハハハ!はい。そのとおり。 :p –

答えて

3

これは簡単ではありません。

まず、特定の場所に関係のあるすべての場所を取得する必要があります。この結果にはlocationiddistanceが含まれています。

場所自体との距離はゼロです。私は<locationid,distance>のリストを作るためにUNION ALLの助けを借りてきました。

次に、上記のリストとdriversの表の間にINNER JOINlocationと一致するようにします。

最後に、distanceに基づいて結果セットを昇順にソートします。

SELECT 
* 
FROM drivers DR 
INNER JOIN 
(
    SELECT 
    locationid, 
    0 AS distance 
    FROM location 
    WHERE locationname = 'Gulshan' 

    UNION ALL 

    SELECT 
    IF(L.locationid = D.fromid, D.toid, D.fromid), 
    D.distance 
    FROM location L 
    INNER JOIN distance D ON L.locationid IN (D.fromid,D.toid) 
    WHERE locationname = 'Gulshan' 
) AS t 
ON DR.location = t.locationid 
ORDER BY t.distance 

See Rextester Demo

OR

See SQL Fiddle Demo


注:あなたは最も上部に含む結果セットを制限するためにLIMIT nを含むことができ検索結果

最終結果が意味をなさないように、..WHERE distance < MAX_ALLOWABLE_DISTANCE...をクエリに含めることもできます。

+1

ほとんど完了しました。良いもの:) –

+1

ありがとうございました。素晴らしい答え! –

関連する問題