我正在处理的表有多行,它们的lat
和具有相同的值lon
。该示例显示1
, 3
,5
具有相同的位置,但name
属性不同。是由hash
构建的name
,lat
因此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
(次要)分配给其他人。哪个“重复”被标记为主要并不重要。
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 JOIN
使用哪个。WHERE t2.id IS NULL
但是,我无法想象 aJOIN
应该如何处理两个以上的重复项。Mark Harrison在他的帖子开头还假设“您正在加入没有重复的列” ,这听起来好像不是一个好主意。
如果感兴趣,我正在使用 MySQL。