Mysql 在SQL表中查找重复值,并在列中添加唯一值

Mysql 在SQL表中查找重复值,并在列中添加唯一值,mysql,sql,count,subquery,window-functions,Mysql,Sql,Count,Subquery,Window Functions,我有一个包含位置的表,其中有重复的位置,因为有同名的位置属于不同的县 +------+-----------+----------- | ID | location | parent_id | +------+-----------+------------+ | 1 | Country | 0 | | 2 | County 1 | 1 | | 3 | County 2 | 1

我有一个包含位置的表,其中有重复的位置,因为有同名的位置属于不同的县

  +------+-----------+-----------
| ID   | location   | parent_id  | 
+------+-----------+------------+
|  1   | Country   |    0       |         
|  2   | County 1  |    1       |         
|  3   | County 2  |    1       |         
|  4   | A         |    2       |         
|  5   | B         |    2       |         
|  6   | C         |    2       |          
|  7   | A         |    3       |         
|  8   | E         |    3       |           
|  9   | B         |    3       |         
+---- -+-----------+------------+
我想为每个重复的ID值创建并在列中插入副本。结果应该是这样的:(最好将重复列中的ID添加到所有重复项中,ID最小的除外)

我使用此选项列出行:

SELECT a.* FROM mytable a

JOIN (SELECT location, COUNT(*)
FROM mytable 
GROUP BY location
HAVING count(*) > 1 ) b
ON a.location= b.location
ORDER BY a.location

看起来窗口计数可以实现您想要的功能:

select t.*,
    case when count(*) over(partition by location) > 1 then id end duplicate
from mytable t
这需要MySQL 8.0。在早期版本中,另一种选择是关联子查询:

select t.*,
    case when (select count(*) from mytable t1 where t1.location = t.location) > 1 then id end duplicate
from mytable t

我没有看到重复的<代码>具有
ID
=
4
的A具有
父ID
=
2
具有
ID
=
7
的A
具有
父ID
=
3
。两个
A
都是唯一的。树结构中的哪个看起来像:
Country->Country1->A
,分别是:
Country->Country2->A
您的数据结构中的位置是什么?我已经对问题进行了更改。这是关于重复的“位置”值,而不是ID“位置”也是唯一的。见我之前的评论。第一个
A
位于
Country1
,第二个
A
位于
Country2
。假设一个
纽约
城市可以存在于
美国
加拿大
甚至
波兰
。至于我,这个问题并不清楚。所以,即使你的问题是正确的,我也不能投票支持你的答案。这句话:有重复的地方,因为有相同的名称,属于不同的县是完全理解错误。请看我对这个问题的评论。我不会说它们是重复的。我将使用相同的值来调用它们。所以,不管每一个都有不同的id,您必须承认您可以在列location中找到两个位置A和位置B。所以,我只想在列中添加重复的每个位置的id,而不是在列位置中找到一次
select t.*,
    case when (select count(*) from mytable t1 where t1.location = t.location) > 1 then id end duplicate
from mytable t