【问题标题】:How to remove duplicate records while using UNION使用 UNION 时如何删除重复记录
【发布时间】:2016-12-06 18:35:34
【问题描述】:

我在 mysql 表中使用 2 个纬度和 2 个经度因为某些记录有多个位置,所以我要加入纬度和经度记录。但是在使用 UNION 加入记录时,会创建一些较早的重复记录。那么,如何避免重复记录。谁能帮帮我。

如何创建重复记录。 例如,一条记录有 2 个地点之间的距离为 500 公里,但是当我们使用 HAVING 距离超过 500 公里时。纬度将拉一次记录,而 tatitude1 将拉一次记录。所以我们可以得到两条记录。所以,这就是问题所在。

 SELECT * , (6371 * acos(cos(radians($Latitude)) * cos(radians(latitude)) * cos(radians(longitude) - radians($Longitude)) + sin(radians($Latitude)) * sin(radians(latitude)))) AS distance 
 FROM mytable
 HAVING distance < $Distance

       UNION DISTINCT

 SELECT * , (6371 * acos(cos(radians($Latitude)) * cos(radians(latitude1)) * cos(radians(longitude1) - radians($Longitude)) + sin(radians($Latitude)) * sin(radians(latitude1)))) AS distance 
       FROM mytable
 HAVING distance < $Distance
 ORDER BY distance

【问题讨论】:

  • UNION 默认为 DISTINCT。你能提供样本数据吗?你确定你得到重复的行吗?
  • 你是UNION同桌,这有什么意义?
  • 是的,这是由纬度来的,然后同样的记录又来纬度1
  • HAVING distance 没有GROUP BY?
  • 向我们展示重复记录的样子?也许是带有特殊/不可见字符的字符串。因为正如 Dekel 所说 UNION 默认删除重复项,UNION ALL 保留重复项

标签: php mysql latitude-longitude


【解决方案1】:

UNION DISTINCT 比较整行。这包括distance。但是,如果我理解您的描述,这两个距离可能会有所不同。

方案A:不返回距离:

( SELECT * FROM tbl
      WHERE (big-long-forumula) < $Distance )
UNION DISTINCT
( SELECT * FROM tbl
      WHERE (other formula) < $Distance )

B 计划:使用OR

SELECT *,
       (...) AS distance1,
       (...) AS distance2
    FROM tbl
    HAVING distance1 < $Distance
        OR distance2 < $Distance

(两者都不会“快速”,尤其是当您要扫描数千行时。)

【讨论】:

  • 非常感谢,B 计划不会创建重复的 ID。谢谢,谢谢,非常感谢。
  • 你的 sql 给你 2 行;我的 B 计划在一行中为您提供 2 个距离。
猜你喜欢
  • 1970-01-01
  • 2011-11-30
  • 1970-01-01
  • 1970-01-01
  • 2020-03-31
  • 2011-07-28
  • 1970-01-01
  • 2021-03-17
相关资源
最近更新 更多