¿Cómo identificar duplicados en MySQL sin considerar caracteres especiales?

  • Autor Autor blogers
  • Fecha de inicio Fecha de inicio
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 edición:
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 edición:
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 edición:
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(*) >
 
Atrás
Arriba