0

storesストア情報と、さらに重要なことに、さまざまなマーチャントのストアの位置座標を含むと呼ばれるテーブルがあります。マーチャントは、さまざまな場所に複数の店舗を持つことができます。(特定の場所からの) 距離順に並べられた店舗のリストが必要で、各商人の最寄りの店舗のみがリストに表示されます。

次のクエリは機能しますが、最適ではないと思います。このクエリを修正または改善する方法はありますか?

SELECT 
    `Store`.`id`, 
    `Merchants`.`id`, 
    `Store`.`area_id`, 
    `Store`.`url`, 
    ( 6371 * acos( cos( radians(18.973212066666665) ) * cos( radians( Store.latitude ) ) * cos( radians( Store.longitude ) - radians(72.8140959) ) + sin( radians(18.973212066666665) ) * sin( radians( Store.latitude ) ) ) ) AS distance 
FROM 
    `stores` AS `Store` 
INNER JOIN 
    (SELECT DISTINCT id,( 6371 * acos( cos( radians(18.973212066666665) ) * cos( radians( Store.latitude ) ) * cos( radians( Store.longitude ) - radians(72.8140959) ) + sin( radians(18.973212066666665) ) * sin( radians( Store.latitude ) ) ) ) AS distance FROM stores as Store WHERE Store.active=1 AND Store.parent_id=0 AND (( 6371 * acos( cos( radians(18.973212066666665) ) * cos( radians( Store.latitude ) ) * cos( radians( Store.longitude ) - radians(72.8140959) ) + sin( radians(18.973212066666665) ) * sin( radians( Store.latitude ) ) ) ) < 50) GROUP BY Store.id ORDER BY distance) AS `St` ON (`St`.`id` = `Store`.`id`) 
INNER JOIN 
    merchants AS `Merchants` ON (`Store`.`merchant_id` = `Merchants`.`id`) 
WHERE 
    (( 6371 * acos( cos( radians(18.973212066666665) ) * cos( radians( `Store`.`latitude` ) ) * cos( radians( `Store`.`longitude` ) - radians(72.8140959) ) + sin( radians(18.973212066666665) ) * sin( radians( `Store`.`latitude` ) ) ) ) < 50) AND 
        `Store`.`parent_id` = 0 AND 
        `Store`.`active` = 1  
GROUP BY 
    `Merchants`.`id`  
ORDER BY 
`distance` ASC  
LIMIT 10

次の式を使用して距離を計算しています ( 6371 * acos( cos( radians( LATITUDE ) ) * cos( radians( Store.latitude ) ) * cos( radians( Store. longitude ) - radians( LONGITUDE ) ) + sin( radians ( LATITUDE ) ) * sin( radians( Store.latitude ) ) ) )

4

1 に答える 1

0
  1. 商人テーブルはまったく必要ないようです。とにかくストアテーブルにあるmerchant_idにのみ使用しています。したがって、この結合を回避できます。

必要なものを正しく理解できたら、次のクエリを試してみてください。

    select id, merchant_id, area_id, url, 
min(distance function you are using) as distance 
from stores group by merchant id, order by distance

実際に実行したわけではありませんが、アイデアはうまくいくはずです。

-マンシ

于 2012-07-31T18:18:16.843 に答える