Php 从MySQL表中筛选重复行

Php 从MySQL表中筛选重复行,php,mysql,sql,Php,Mysql,Sql,如果在其他地方得到答复,我将立即表示歉意。我似乎找不到一个有效的版本,我尝试了很多不同的东西,一些来自知识,另一些来自谷歌 我在SQL查询中使用Haversine公式对一些零售商店的距离进行排序,以便在地图上绘制它们。我得到的距离和什么不好,但当我添加了一个选项,以过滤出重复,或连锁店,我遇到了问题。问题因我尝试过的不同查询而有所不同,我想知道是否有人能指出我哪里出了问题,以便我能从这次经历中吸取教训D 我尝试过的东西(注意:这些示例中的lat/lon是false lat/lon,我从另一个SQ

如果在其他地方得到答复,我将立即表示歉意。我似乎找不到一个有效的版本,我尝试了很多不同的东西,一些来自知识,另一些来自谷歌

我在SQL查询中使用Haversine公式对一些零售商店的距离进行排序,以便在地图上绘制它们。我得到的距离和什么不好,但当我添加了一个选项,以过滤出重复,或连锁店,我遇到了问题。问题因我尝试过的不同查询而有所不同,我想知道是否有人能指出我哪里出了问题,以便我能从这次经历中吸取教训D

我尝试过的东西(注意:这些示例中的lat/lon是false lat/lon,我从另一个SQL表中得到的lat/lon):

这将使我完成基本的工作。获取最近的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
这确实会渲染结果,但实际上它会过滤掉所有相同的链,而不仅仅是在显示一个链之后。例如,如果我们有沃尔玛、好市多、沃尔玛、沃尔玛、塔吉特等。。。然后我只想显示第一个Walgreen并过滤掉第二个。谷歌搜索让我相信GROUPBY条款会起作用。它清除了所有的沃尔格林。事实上,它删除了所有具有重复项的行


我还尝试了按门店名称分组,其计数(*)为1和
=
我在您的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' 
    GROUP BY GROUP BY store_name
    ORDER BY distance LIMIT 0 , 10
或者试试这个:

SELECT store_id,
col_a,
col_b,
col_c,
DISTINCT(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
一个解决方案:-

SELECT store_id,col_a,col_b,col_c,stores.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, sub1.distance AS distance 
FROM stores 
INNER JOIN
(
    SELECT store_name, MIN(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 
) sub1
ON stores.store_name = sub1.store_name
AND (3959*acos(cos(radians(12.1234567)) * cos(radians(latitude)) * cos(radians(longitude)-radians(-45.678910.)) + sin(radians(12.1234567)) * sin(radians(latitude)))) = sub1.distance
WHERE primary_provider_code = '01' OR secondary_provider_code = '01' OR tertiary_provider_code = '01' 
ORDER BY distance LIMIT 0 , 10

这将使用子查询为每个链获取最近的门店(因此子查询中的MIN/GROUP BY),然后将其与stores表关联,以获取最近门店的完整详细信息。

如果您只需要最近门店的不同门店名称,那么您可以在当前查询的基础上执行不同的查询,如下所示:

SELECT DISTINCT STORE_NAME
FROM
(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
) nearest_stores;

我不是只找一家店。我正在查找该区域的所有门店,过滤掉多余的门店。我也不能。但是,当我执行
GROUP BY
子句时,我会丢失数据库中所有多余或重复的门店。因此,由于我没有sql错误和不正确的结果,我想问问So的人。GROUP BY将删除重复项。问题是,如果你有(比如)10家沃尔玛商店,并且你按连锁店的名称分组,它将带回其中一家沃尔玛商店。哪一个(即,不在分组依据中的所有字段的内容)未定义。已工作!我很感谢你的帮助,这是一次很好的学习经历,重新写了一遍,加入了我需要的额外部分。
SELECT store_id,
col_a,
col_b,
col_c,
DISTINCT(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
SELECT store_id,col_a,col_b,col_c,stores.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, sub1.distance AS distance 
FROM stores 
INNER JOIN
(
    SELECT store_name, MIN(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 
) sub1
ON stores.store_name = sub1.store_name
AND (3959*acos(cos(radians(12.1234567)) * cos(radians(latitude)) * cos(radians(longitude)-radians(-45.678910.)) + sin(radians(12.1234567)) * sin(radians(latitude)))) = sub1.distance
WHERE primary_provider_code = '01' OR secondary_provider_code = '01' OR tertiary_provider_code = '01' 
ORDER BY distance LIMIT 0 , 10
SELECT DISTINCT STORE_NAME
FROM
(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
) nearest_stores;