我正在处理的表有多个行,它们的lat和值相同lon。实例表明1,3,5具有相同的位置,但name属性不同。在hash从建立name,lat以及lon和不同因此。
lat
lon
1
3
5
name
hash
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 并不重要。
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这篇帖子和这张视觉描述的启发中,我开始尝试。这样,我就可以为所有重复项分配相同的标志。
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应该如何处理 多于两个的重复项 。
LEFT OUTER JOIN
WHERE t2.id IS NULL
JOIN
如果对此感兴趣,我正在使用MySQL。
不确定这是否非常有效,但是它仅在一个查询中起作用:
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);