two repeated query one multiple keep duplicate delete columns but mysql distinct duplicate-removal

repeated - select distinct mysql



MySQL SELECCIONE filas DISTINCT(no columnas) para filtrar $_POST para duplicados (2)

Estoy tratando de filtrar las filas de la tabla de MySQL, donde todos los datos de $_POST se almacenan desde un formulario en línea. En ocasiones, la conexión a Internet del usuario se detiene o el navegador se estropea, y no se muestra la nueva página después del envío del formulario (aunque el INSERTADO funcionó y se creó la fila de la tabla). Luego presionan actualizar y envían su formulario dos veces, creando una fila duplicada (a excepción de las columnas de identificación de tiempo y autoincrement).

Me gustaría seleccionar envíos de formularios únicos. Esta tiene que ser una tarea realmente común, pero parece que no puedo encontrar algo que me permita llamar con DISTINCT aplicando a cada columna excepto a la marca de tiempo y al ID de una manera concisa (algo así como SELECT id, timestamp, DISTINCT everything_else FROM table; . Por el momento, puedo hacer:

CREATE TEMPORARY TABLE IF NOT EXISTS temp1 AS ( SELECT DISTINCT everything,except,id,and,timestamp FROM table1 ); SELECT * FROM table1 LEFT OUTER JOIN temp1 ON table1.everything = temp1.everything ... ;

Mi mesa tiene 20k filas con alrededor de 25 columnas (características de clasificación para un ejercicio de aprendizaje automático). Esta consulta lleva una eternidad (ya que supongo que atraviesa las 20k filas 20K veces?) Nunca he dejado que se ejecute hasta su finalización. ¿Cuál es la forma de práctica estándar para hacer esto?

Nota: Esta pregunta sugiere agregar un índice a las columnas relevantes, pero puede haber un máximo de 16 partes clave en un índice. ¿Debo simplemente elegir los únicos únicos? Puedo encontrar aproximadamente 700 duplicados en 2 segundos de esta manera, pero no puedo estar seguro de no tirar una fila única porque también tengo que ignorar algunas columnas al especificar el índice.


Trataría de eliminar el problema en primer lugar. Hay técnicas para eliminar este problema. La primera en mi mente es que podrías generar una cadena aleatoria y almacenarla tanto en la sesión como en un campo oculto en el formulario. Esta cadena aleatoria se debe generar cada vez que se muestra el formulario. Cuando el usuario envía el formulario, debe verificar que coincidan la clave de sesión y la clave de entrada. Asegúrese de generar una clave diferente en cada solicitud. Por lo tanto, cuando un usuario actualiza la página, enviará una clave anterior y no coincidirá.

Otra solución podría ser que si estos datos siempre deben ser únicos en la base de datos, compruebe si hay datos exactos en la base de datos antes de insertarlos. Y si los datos son únicos, digamos la dirección de correo electrónico, puede crear un índice clave único. Por lo tanto, ese campo tendrá que ser único en la tabla.


Si tiene una clave UNIQUE (que no sea AUTO_INCREMENT ), simplemente use INSERT IGNORE ... para evitar silenciosamente filas duplicadas. Si no tiene una clave ÚNICA, ¿nunca más necesitará encontrar una fila?

Si ya ha permitido duplicados y necesita deshacerse de ellos, esa es una pregunta diferente.