Como identificar duplicados em MySQL sem considerar caracteres especiais?

  • Autor Autor blogers
  • Data de início Data de início
Tradução em andamento: em alguns minutos este tópico estará em português. Por enquanto, o conteúdo está no original em espanhol. Ver original
B

blogers

Pi
SEO
Hola compañeros, estoy tratando de pedir una ayudita para ver si estoy bien

tengo este code select

Algun colega del foro buena onda que me saque de una duda

PHP:
SELECT * FROM codigos_postales WHERE numero NOT REGEXP '-.·@#¡>:<→←↑↓↨;"!¿?=%$*&}{|~€()/+\s ' group by numero having count(*) >= 1;

Lo que estoy tratando de hacer es buscar repetidos pero ignorando por ejemplo expresiones como: (, ), #, -, _, espacio, /

Y asi por el estilo para que solo busque el numero del codigo postal y no este repetido con un parentesis o un simbolo extra por ejemplo

1234 y que este otro asi (1)234 o bien 1234 y que este asi tambien repetido 1#234 no si me doy a entender y de ante mano muchas gracias colega espero no molestarlos =)
 
Última edição:
Foi útil? Participe da conversa

Com sua conta grátis você pode responder, mandar mensagem privada ao autor e comprar com Saldo retido: o pagamento é liberado quando você recebe o combinado.

Leva 30 segundos · você volta a este tópico ao terminar
No, lo que estás haciendo ahí es filtrar por tu expresión (los que coincidan con esa expresión no van a salir).

Dado que al parecer no existe un REPLACE con expresiones regulares, tendrías que ir anidando para hacer el replace de los caracteres que quieres que se reemplacen, algo como (elimina (, ), # y espacio en blanco):
PHP:
SELECT *
	FROM codigos_postales
	GROUP BY
		REPLACE(
			REPLACE(
				REPLACE(
					REPLACE(numero, '#', ''),
					'(', ''
				),
				')', ''
			),
			' ', ''
		) HAVING COUNT(*) > 1;

También podrías crearte una función que te haga eso funcionamiento y llamarla desde tu consulta, o instalar esta: lib_mysqludf_preg

Saludos.
 
Última edição:
O ya entendi osea una por una para ir sacandolos poco a poco como por ejemplo '-.·@#¡>:<→←↑↓↨;"!¿?=%$&}{|~€()/+\s ' ir caracter por cararter, que serian mas bien las que mencione
No, lo que estás haciendo ahí es filtrar por tu expresión (los que coincidan con esa expresión no van a salir).

Dado que al parecer no existe un REPLACE con expresiones regulares, tendrías que ir anidando para hacer el replace de los caracteres que quieres que se reemplacen, algo como (elimina (, ), # y espacio en blanco):
PHP:
SELECT *
	FROM codigos_postales
	GROUP BY
		REPLACE(
			REPLACE(
				REPLACE(
					REPLACE(numero, '#', ''),
					'(', ''
				),
				')', ''
			),
			' ', ''
		) HAVING COUNT(*) > 1;

También podrías crearte una función que te haga eso funcionamiento y llamarla desde tu consulta, o instalar esta: lib_mysqludf_preg

Saludos.

- - - Actualizado - - -

Asi esta bien para revisar si hay numeros repetidos y los que contengan letras por que me salto un error mira checamelo por fis

PHP:
SELECT *
FROM codigopostal 
GROUP BY REPLACE (numero, '[a-z]', '')
having count(*) >= 1;


No, lo que estás haciendo ahí es filtrar por tu expresión (los que coincidan con esa expresión no van a salir).

Dado que al parecer no existe un REPLACE con expresiones regulares, tendrías que ir anidando para hacer el replace de los caracteres que quieres que se reemplacen, algo como (elimina (, ), # y espacio en blanco):
PHP:
SELECT *
	FROM codigos_postales
	GROUP BY
		REPLACE(
			REPLACE(
				REPLACE(
					REPLACE(numero, '#', ''),
					'(', ''
				),
				')', ''
			),
			' ', ''
		) HAVING COUNT(*) > 1;

También podrías crearte una función que te haga eso funcionamiento y llamarla desde tu consulta, o instalar esta: lib_mysqludf_preg

Saludos.
 
O ya entendi osea una por una para ir sacandolos poco a poco como por ejemplo '-.·@#¡>:<→←↑↓↨;"!¿?=%$&}{|~€()/+\s ' ir caracter por cararter, que serian mas bien las que mencione

- - - Actualizado - - -

Asi esta bien para revisar si hay numeros repetidos y los que contengan letras por que me salto un error mira checamelo por fis

PHP:
SELECT *
FROM codigopostal 
GROUP BY REPLACE (numero, '[a-z]', '')
having count(*) >= 1;

No te entendí. Pero creo que REPLACE no acepta expresiones regulares por eso lo que te comenté de ir anidandolos.
 
Ponme un ejempo digamos quiero buscar el repetido en este caso seria este codigo postal que tiene 2 parentesis y 2 guines
c8edc735ee.png
Y alli uno repetido
No te entendí. Pero creo que REPLACE no acepta expresiones regulares por eso lo que te comenté de ir anidandolos.
 
Ponme un ejempo digamos quiero buscar el repetido en este caso seria este codigo postal que tiene 2 parentesis y 2 guines
c8edc735ee.png
Y alli uno repetido

Eso no es para borrar, es para encontrar los repetidos, que fue lo que dijiste que querias hacer en el primer mensaje. :topsy_turvy:

Para borrar ya tendrías que hacer más cosas, para ese caso especifico quizás con algo como esto quedaría:
PHP:
DELETE FROM codigos_postales WHERE id NOT IN(
    SELECT MIN(id)
        FROM codigos_postales
        GROUP BY
            REPLACE(
                REPLACE(
                    REPLACE(
                        REPLACE(numero, '-', ''),
                        '(', ''
                    ),
                    ')', ''
                ),
                ' ', ''
            )
);
 
Última edição:
O ya veo Muchas gracias colega te puedo agregar a tu skype ?


Eso no es para borrar, es para encontrar los repetidos, que fue lo que dijiste que querias hacer en el primer mensaje. :topsy_turvy:

Para borrar ya tendrías que hacer más cosas, para ese caso especifico quizás con algo como esto quedaría:
PHP:
DELETE FROM codigos_postales WHERE id NOT IN(
    SELECT id
        FROM codigos_postales
        GROUP BY
            REPLACE(
                REPLACE(
                    REPLACE(
                        REPLACE(numero, '-', ''),
                        '(', ''
                    ),
                    ')', ''
                ),
                ' ', ''
            )
);
 
como ver si hay registros duplicados en una tabla con mysql

SELECT email, COUNT(*) Total
FROM clientes
GROUP BY email
HAVING COUNT(*) >
 
Voltar
Topo