小编典典

如何在同一张表上更新具有不同值的多个重复项?

sql

我正在处理的表有多个行,它们的lat和值相同lon。实例表明135具有相同的位置,但name属性不同。在hash从建立namelat以及lon和不同因此。

BEFORE:

 id | name | lat | lon | flag | hash
----+------+-----+-----+------+------
 1  | aaa  | 16  | 48  |  0   | 2cd       <-- duplicate
 2  | bbb  | 10  | 22  |  0   | 3fc
 3  | ccc  | 16  | 48  |  0   | 8ba       <-- duplicate
 4  | ddd  | 10  | 23  |  0   | c33
 5  | eee  | 16  | 48  |  0   | 751       <-- duplicate

我需要在此表中标识“重复项”,并想将标志1主要 )分配给其中一个,将标志2次要 )分配给其他。将“重复”标记为 primary
并不重要。

 AFTER:

 id | name | lat | lon | flag | hash
----+------+-----+-----+------+------
 1  | aaa  | 16  | 48  |  1   | 2cd       <-- updated
 2  | bbb  | 10  | 22  |  0   | 3fc
 3  | ccc  | 16  | 48  |  2   | 8ba       <-- updated
 4  | ddd  | 10  | 23  |  0   | c33
 5  | eee  | 16  | 48  |  2   | 751       <-- updated

INNER JOIN这篇帖子和这张视觉描述的启发中,我开始尝试。这样,我就可以为所有重复项分配相同的标志。

UPDATE table t1
INNER JOIN table_name t2
ON
  t1.lat = t2.lat
  AND t1.lon = t2.lon
  AND t1.hash != t2.hash
SET
  t1.flag = 2;

我还测试LEFT OUTER JOINWHERE t2.id IS NULL只有两行时可以使用的方法。但是,我无法想到aJOIN应该如何处理
多于两个的重复项

如果对此感兴趣,我正在使用MySQL。


阅读 173

收藏
2021-05-16

共1个答案

小编典典

不确定这是否非常有效,但是它仅在一个查询中起作用

UPDATE t
JOIN (
  SELECT MAX(t.id) AS maxid, lat, lon
  FROM t
  JOIN t AS duplicates
  USING (lat, lon)
  GROUP BY lat, lon
  HAVING COUNT(*) > 1
) AS maxima USING (lat, lon)
SET flag = IF(id = maxid, 1, 2);
2021-05-16