Yokoshimax

Capo
Se incorporó
19 Noviembre 2007
Mensajes
332
Hola Cabros,

Ando con una duda que necesito resolver, a ver si me pueden iluminar.
Tengo una tabla que no debiese tener campos repetidos, pero los tiene por mal modelamiento.

La tabla es de esta índole
Inscripción:
id
dato1
dato2
usuario_id
curso_id

Existen usuarios que están inscritos más de 1 vez en un curso, lo cual no es correcto, más que buscar que esto exista (lo que es cierto) me gustaría buscar el ID de cada tuple que se repite o al menos el usuario_id y curso_id de cada una de las tuplas que tengan estas repeticiones, no es necesario que me muestre n veces cada repetición, si no que 1 vez por cada repetición
De ante mano
una vez borrando los registros que se repiten, aplico restrición de unique a estas columnas

de ante mano GRACIAS!
 

YaRock

Programmar
Se incorporó
27 Junio 2007
Mensajes
142
Primero determina en que columnas están los datos repetidos, y luego haces dos select uno las columnas que dejaras y el otro con las repetidas, estos select los unes en uno solo uniendo por sus columnas que tengan misma data y con esto tendrías el listado de repetidos.

Otra opción es agrupar por los campos que se repiten y utilizar el having en una consulta.

Cuentame si te sirve.
 
Última modificación:
Upvote 0

Amenadiel

Ille qui nos omnes servabit
Fundador
OVERLORD
REPORTERO
Se incorporó
15 Enero 2004
Mensajes
18.398
Podrias listar el minimo id de las tuplas que se repiten

Código:
Select min(id),
Usuario_id,
Curso_id,
Group_concat(id),
Count(id),
From inscripcion
Group by usuario_id, curso_id
Having count(id)> 1

De ahi puedes borrar usando la condición de que los id sean distintos al mínimo para esa tupla
 
Upvote 0

Yokoshimax

Capo
Se incorporó
19 Noviembre 2007
Mensajes
332
Gracias a todos, No respondí antes de puro volao que soy, pero lo que me dijo [MENTION=22974]YaRock[/MENTION] me sirvió y construí:

SELECT *FROM inscripcion
WHERE CONCAT( usuario_id, curso_id )
IN (
SELECT CONCAT( usuario_id, curso_id )
FROM inscripcion
GROUP BY CONCAT( usuario_id, curso_id )
HAVING COUNT( CONCAT( usuario_id, curso_id) ) >1
)
La media vuelta que me dí (XD)

Pero la de [MENTION=105]Amenadiel[/MENTION] está mucho más elegante

Cual sería el mejor índice para esa tabla (ambas tuplas cierto, usuario_id y curso_id)

Gracias nuevamente!
 
Upvote 0

Amenadiel

Ille qui nos omnes servabit
Fundador
OVERLORD
REPORTERO
Se incorporó
15 Enero 2004
Mensajes
18.398
Por la manera como se construye un índice RTree, si haces

Código:
Create unique index (usuario_id, curso_id) on inscripcion

Estarás manteniendo la unicidad y optimizando las queries ya sea que busques por ambos campos o sólo uno de los dos.

Obviamente siempre necesitas el primary key en el id. Aunque es posible generar un primary compuesto sobre (usuario_id, curso_id) es salirse del estandar, es difícil de mantener y te pone problemas para la atomicidad de los updates.
 
Upvote 0

Yokoshimax

Capo
Se incorporó
19 Noviembre 2007
Mensajes
332
Por la manera como se construye un índice RTree, si haces

Código:
Create unique index (usuario_id, curso_id) on inscripcion

Estarás manteniendo la unicidad y optimizando las queries ya sea que busques por ambos campos o sólo uno de los dos.

Obviamente siempre necesitas el primary key en el id. Aunque es posible generar un primary compuesto sobre (usuario_id, curso_id) es salirse del estandar, es difícil de mantener y te pone problemas para la atomicidad de los updates.

Gracias!!! :aplausos te ganaste un baltilocas en la zapla y unas :archon
 
Upvote 0
Subir