MySQL - Ordered GROUP BY 问题优化

Posted

技术标签:

【中文标题】MySQL - Ordered GROUP BY 问题优化【英文标题】:MySQL - Ordered GROUP BY Issue Optimization 【发布时间】:2012-07-26 17:40:42 【问题描述】:

我有一个名为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( 弧度(LATITUDE) ) * cos( 弧度( Store.latitude ) ) * cos( 弧度( Store.longitude ) - 弧度(LONGITUDE))+ sin(弧度(LATITUDE))* sin(弧度(Store.latitude))))

【问题讨论】:

【参考方案1】:
    看起来您根本不需要商人表。无论如何,您仅将其用于 store 表中的 Mercer_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

我并没有实际运行它,但这个想法应该可行。

-曼西

【讨论】:

以上是关于MySQL - Ordered GROUP BY 问题优化的主要内容,如果未能解决你的问题,请参考以下文章

mysql 可以group by 两个字段吗

mysql group by 问题

mysql group by问题

mysql group by 能用到索引么

mysql:group by,order by

mysql 可以group by 两个字段吗