2

クライアントではなくデータベース側でこのようなループが必要です。

while($result = mysql_fetch_array($exec)) {
    $pitagoras = sqrt(($result['driverpoint_lat']-$lat1)*($result['driverpoint_lat']-$lat1)+($result['driverpoint_lng']-$lng1)*($result['driverpoint_lng']-$lng1));

    if($pitagoras < $distance_least) {
        $distance_least = $pitagoras;
        $closest_driver = $result['iddriver'];
    }
}

mysql_fetch_array()行からデータを取得したい場合、またはmysql側でそのような機能を実現するためのまったく別の方法がある場合に置き換える方法はありますか?

4

3 に答える 3

0

@andreshernandezに感謝します。これは私が以前は考えていなかったことですが、うまく機能します。''でテキストをフォーマットできなかったので、ここに書いています

これは、コードを使用したスト​​アド関数です。

  DELIMITER $$ 
  CREATE FUNCTION sampleFunc9( lat DOUBLE, lng DOUBLE ) 
  RETURNS INT 
  DETERMINISTIC 
  BEGIN 
  DECLARE result DOUBLE; 
  SET result = (SELECT iddriver FROM driver ORDER BY (driverpoint_lat - lat) * (driverpoint_lat - lat) + (driverpoint_lng - lng) * (driverpoint_lng - lng) ASC LIMIT 1); 
  return result; 
  END $$
于 2012-11-26T17:54:50.170 に答える
0

ここから始めることができます。これはストアドプロシージャではありませんが、問題はありません。

距離を返すようにクエリを作成し、その距離で並べ替えます。

SELECT iddriver, ..., 
(driver_lat - $lat) * (driver_lat - $lat) + 
(driver_lng - $lng) * (driver_lng - $lng) as dxd
FROM ... WHERE ...
ORDER BY dxd ASC

結果は同じであり、すべての行でSQRTを実行しているわけではないため、その結果にdxdという名前をdistancexdistanceのように付けます。

結果は、最も短い距離にあるドライバーを最初に持つドライバーのリストです。LIMITも使用できます。

注:これをプリペアドステートメントに入れたり、PDOを介して実行したりすることは難しくありません。結論として、SQLインジェクションに注意してください。

于 2012-11-26T16:42:30.393 に答える
0

これをアプリケーション側で行うのではなく、データベース上の関数またはストアド プロシージャに入れたいと思われます。これを行うことはお勧めしません。データベースは、アプリケーションの作業を行うためのものではありません。とにかく、先生がこれを要求したので、MySQL の数学関数を見てください。

投稿したコードを見ると、アプリケーション側 ( $lat1& $lng1) にある変数があります。これらを関数に渡しますか?

この回答は、数学関数が MySQL 関数内でどのように使用され、PHP によって呼び出されるかを示す良い出発点です。これは廃止予定mysql_の関数を使用して記述されていることに注意してください。または関数を使用する必要があります。mysqli_PDO

于 2012-11-26T15:46:01.890 に答える