【发布时间】:2014-04-24 15:03:33
【问题描述】:
如果这已在其他地方得到回答,我会立即道歉。我似乎无法获得此版本的工作版本,并且我尝试了许多不同的东西,一些来自知识,另一些来自谷歌搜索。
我在我的 SQL 查询中使用 Haversine 公式来计算几家零售店的距离,以便将它们绘制在地图上。我得到了距离,什么不好,但是当我添加一个选项来过滤掉重复的或连锁的商店时,我遇到了问题。这些问题根据我尝试过的不同查询而有所不同,我想知道是否有人可以指出我哪里出错了,以便我可以从这次经历中学习。 :D
我尝试过的事情(注意:这些示例中的 lat/lon 是错误的 lat/lon,而我得到的 lat/lon 来自另一个 SQL 表):
SELECT store_id,col_a,col_b,col_c,store_name,store_number,street_address,apt_suite,city,state_id,zip_code,latitude,longitude,phone_number,phone_extension,fax_number,email_addr,location_direction,open_24_hr,website_url, (3959*acos(cos(radians(12.1234567)) * cos(radians(latitude)) * cos(radians(longitude)-radians(-45.678910.)) + sin(radians(12.1234567)) * sin(radians(latitude)))) AS distance FROM stores WHERE primary_provider_code = '01' OR secondary_provider_code = '01' OR tertiary_provider_code = '01' ORDER BY distance LIMIT 0 , 10
这将使我完成基础知识。获取最近的 10 家商店,按距离订购,并且只选择我想要的列。现在,当有人点击“过滤相同链”选项时,我尝试了以下操作:
SELECT store_id,col_a,col_b,col_c,store_name,store_number,street_address,apt_suite,city,state_id,zip_code,latitude,longitude,phone_number,phone_extension,fax_number,email_addr,location_direction,open_24_hr,website_url, (3959*acos(cos(radians(12.1234567)) * cos(radians(latitude)) * cos(radians(longitude)-radians(-45.678910.)) + sin(radians(12.1234567)) * sin(radians(latitude)))) AS distance FROM stores WHERE primary_provider_code = '01' OR secondary_provider_code = '01' OR tertiary_provider_code = '01' GROUP BY store_name ORDER BY distance LIMIT 0 , 10
这确实会渲染结果,但它实际上会过滤掉每个相同的链,而不仅仅是在显示一个之后。例如,如果我们有 Walgreens、Costco、Wal-Mart、Walgreens、Target 等……那么我只想显示第一个 Walgreens 并过滤掉第二个。谷歌搜索让我相信 GROUP BY 子句会起作用。它删除了所有沃尔格林。事实上,它删除了所有重复的行。
为了尝试,我还尝试了 GROUP BY store_name HAVING COUNT(*) = 1 和 >,<,>=,<= 变体。
我不相信我可以做一个SELECT DISTINCT,因为其他列本身都是不同的,所以即使 store_name 可能有重复,我试图选择的所有其他行都是唯一的.此外,我已经尝试过并确认它不会过滤掉非唯一列。
提前感谢您的帮助。请注意,我也标记了 PHP,因为众所周知它可以与 SQL 交互,而我正在开发的平台是 PHP。
注意:我不是只寻找一家商店。我正在寻找所有商店,按距离排序,分组并过滤掉重复的商店。假设未经过滤的结果是
Wal-Mart
K-Mart
Wal-Mart
Walgreens
Costco
Sams Club
Wal-Mart
Costco
Walgreens
我要返回过滤后的结果:
Wal-Mart
K-Mart
Walgreens
Costco
Sams Club
【问题讨论】:
-
A GROUP BY 将删除重复项。问题是,如果您有(例如)10 家沃尔玛商店,并且您按连锁店名称进行分组,它将带回其中一家沃尔玛商店。哪一个(即所有不在 GROUP BY 中的字段的内容)是未定义的。