Dar Replace em nomes repetidos [MYSQL]

16/04/2018

0

Estou com um problema.
Tenho um banco de gerenciamento de fazendas. Dentro desse banco existe uma tabela chamada "Region" e dentro dessa tabela existe uma coluna chamada "id", outra chamada "Parent_region_id" e uma chamada "name".
Funciona da seguinte forma, o parent_region_id contém o ID da região no qual aquele talhão pertence.
Abaixo segue um exemplo do problema:

______________________________
| ID | Name | Parent_region_id|
| 25 | T100 | 202 |
| 26 | T100 | 202 |
| 27 | T101 | 202 |
| 28 | T100 | 202 |
--------------------------------------------------

Quando existir "Name" repetido com a mesma Parent_region_id, devo adicionar ".1,.2" na frente para não ficar repetido.

O ideal é que fique assim:
______________________________
| ID | Name | Parent_region_id |
| 25 | T100 | 202 |
| 26 | T100.1 | 202 |
| 27 | T101 | 202 |
| 28 | T100.2 | 202 |
--------------------------------------------------

Porém estou sem saber como fazer isso.
Será que alguém poderia me ajudar?

Obrigado.
Paulo Victor

Paulo Victor

Responder

Posts

20/04/2018

Leandro Chiodini

SELECT COUNT(*), Name , Parent_region_id FROM region

GROUP BY Name , Parent_region_id

HAVING COUNT(*) > 1

Com este select voce acha os duplicados.
Responder

20/04/2018

Paulo Victor

Na verdade eu não queria apenas achar os duplicados. Queria já substituir também, pois existem milhares de casos.
Queria dar um replace nos repetidos para resolver o problema.
Você acha possível?

Obrigado!
Responder

20/04/2018

Paulo Victor

Na verdade eu não queria apenas achar os duplicados. Queria já substituir também, pois existem milhares de casos.<br />
Queria dar um replace nos repetidos para resolver o problema.<br />
Você acha possível?

Obrigado!
Responder

20/04/2018

Leandro Chiodini

O update não é dficil.

seria algo parecido com isso.

update region set name = "novoNome"
where name in
(select name from region
group by name, parent_region_id
having Count(*)>1)
and not id in
(select Min(id) from region
group by name, parent_region_id
having Count(*)>1)

O problema é que voce quer concatenar o nome atual, e da forma como eu fiz ali se no caso como o seu de ter 3 registro com o mesmo nome e com o mesmo parent region ele muda o nome dos dois mantendo somente um como T100...
assim que der vou tentar da uma olhada mais a fundo... ver se consigo te ajudar.
Responder

20/04/2018

Leandro Chiodini

o que daria pra fazer tb com certe é
criar uma tabela temporária para receber os registros duplicados

create temporary table tempregion select * from region
where name in
(select name from region as r
group by name, parent_region_id
having Count(*)>1)
and not id in
(select Min(id) from region
group by name, parent_region_id
having Count(*)>1);

e depois executar um update pegando o nome e acrescendo .1

update region a, tempregion b
set a.name = concat(b.name,'.1')
where a.id = b.id


porem se tiver mais registros exemplo 3, dois deles vão receber o .1 ficando T001.1
então ou você executa ate não ter mais registros duplicados.
ou cria um script para isso ate que o retorno na tabela temporária seja 0
Responder

20/04/2018

Paulo Victor

Perfeito Chiodini.
Muito obrigado!

Vai me ajudar demais!
Responder

Assista grátis a nossa aula inaugural

Assitir aula

Saiba por que programar é uma questão de
sobrevivência e como aprender sem riscos

Assistir agora

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar