2016-06-01 14 views
0

近くのディーラーを検索するディーラーロケーターを作成する。ディーラーがその人の近くに複数の支店を持っていれば、最も近い支店だけが表示されるような仕組みで作業したいと思っています。そのため、「名前」フィールドは結果内で一意でなければならず、同じ「名前」フィールドを持つ他の行と比較して、検索する人との距離が最も短い結果が示されます。私はまた、ディーラーレベル、すなわちメダルで注文された最も近い5つのディーラーだけを望んでいます。今、私は以下の持っている:私は何を読んでから、SQL - 基準に基づくUnqiueの結果

$query = sprintf("SELECT 
name, address, contact, image, medal, phone, email, website, lat, lng, 
(3959 * acos(cos(radians('%s')) * cos(radians(lat)) * cos(radians(lng) - radians('%s')) + sin(radians('%s')) * sin(radians(lat)))) AS distance 
FROM dealers 
HAVING distance < 60 
ORDER BY medal, distance 
LIMIT 0 , 5", 
mysql_real_escape_string($center_lat), 
mysql_real_escape_string($center_lng), 
mysql_real_escape_string($center_lat), 
mysql_real_escape_string($radius)); 
$result = mysql_query($query); 

、私のような何かをする必要があるように聞こえる:そのような

SELECT * FROM (
SELECT ROW_NUMBER() OVER (PARTITION BY name ORDER BY distance) AS num 
FROM dealers)a 
WHERE a.num = 1 

か何かを、私はそれを得ることができません右に働く。どのように私がこれを機能させることができるかについての洞察は非常に高く評価されるだろう。

+4

MySQLは、row_numberなどのウィンドウ関数をサポートしていません。 –

+1

パラメータ化されたクエリに 'sprintf'を使用しないでください。[PDO](http://php.net/manual/en/pdo.prepare.php)を使用してください。より安全で、コードをよりメンテナンス可能にします。 –

+0

[dba.stackexchange.com/questions/40130/mysql-and-window-functions](http://dba.stackexchange.com/questions/40130/mysql-and-window-functions)が役立つ可能性があります。 –

答えて

0

最終解決されました:

 SELECT name, address, contact, image, medal, phone, email, website, lat, lng, 
    (3959 * acos(cos(radians('%s')) * cos(radians(lat)) * cos(radians(lng) - radians('%s')) + sin(radians('%s')) * sin(radians(lat)))) AS distance 
    FROM dealers 
    WHERE (name, 
     (3959 * acos(cos(radians('%s')) * cos(radians(lat)) * cos(radians(lng) - radians('%s')) + sin(radians('%s')) * sin(radians(lat))))) 
     IN 
     (SELECT name, distance 
      FROM (SELECT name, 
      MIN(3959 * acos(cos(radians('%s')) * cos(radians(lat)) * cos(radians(lng) - radians('%s')) + sin(radians('%s')) * sin(radians(lat)))) AS distance 
      FROM dealers 
      WHERE (3959 * acos(cos(radians('%s')) * cos(radians(lat)) * cos(radians(lng) - radians('%s')) + sin(radians('%s')) * sin(radians(lat)))) < 90 
      GROUP BY name) 
     t) 

    ORDER BY medal, distance 
    LIMIT 0, 5", 

    mysql_real_escape_string($center_lat), 
    mysql_real_escape_string($center_lng), 
    mysql_real_escape_string($center_lat), 
    mysql_real_escape_string($center_lat), 
    mysql_real_escape_string($center_lng), 
    mysql_real_escape_string($center_lat), 
    mysql_real_escape_string($center_lat), 
    mysql_real_escape_string($center_lng), 
    mysql_real_escape_string($center_lat), 
    mysql_real_escape_string($center_lat), 
    mysql_real_escape_string($center_lng), 
    mysql_real_escape_string($center_lat) 

は、右のトラックに私を置くために、あなたはThorstenケトナーをありがとうございました!

0

ディーラーごとの最小距離を取得し、最初の5つを取る。その後、テーブルからもう一度選択して完全なレコードを取得しますが、ディーラーと距離によってすでに識別されたレコードのみを取ります。

WITH句が役に立ちますが、MySQLではサポートしていません。まあ、...

SELECT 
    name, address, contact, image, medal, phone, email, website, lat, lng, 
    (3959 * acos(cos(radians('%s')) * cos(radians(lat)) * cos(radians(lng) - radians('%s')) + sin(radians('%s')) * sin(radians(lat)))) AS distance 
FROM dealers 
WHERE (name, (3959 * acos(cos(radians('%s')) * cos(radians(lat)) * cos(radians(lng) - radians('%s')) + sin(radians('%s')) * sin(radians(lat))))) IN 
(
    SELECT 
    name, min(3959 * acos(cos(radians('%s')) * cos(radians(lat)) * cos(radians(lng) - radians('%s')) + sin(radians('%s')) * sin(radians(lat)))) AS distance 
    FROM dealers 
    GROUP BY name 
    HAVING distance < 60 
    ORDER BY distance 
    LIMIT 5 
) 
ORDER BY distance, medal; 
+0

素晴らしいアイデア!それはうまくいくはずです。それはしばらくの間働くことを試みたが、私は何をしているのか、データベースが私を好きではないということについてはほとんど考えていないので、結果は返されない。私はそれに取り組んでいきます。 – Nick

関連する問題