Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General » Mysql »

[SOLUCIONADO] Incoherencia MySQL

Estas en el tema de Incoherencia MySQL en el foro de Mysql en Foros del Web. Hola, tengo una duda que nose si es un error del motor o es algo que yo hago mal... tengo 2 tablas: T1 : Tabla ...
  #1 (permalink)  
Antiguo 06/02/2013, 11:53
Avatar de NSD
NSD
Colaborador
 
Fecha de Ingreso: mayo-2012
Ubicación: Somewhere
Mensajes: 1.332
Antigüedad: 11 años, 11 meses
Puntos: 320
Pregunta Incoherencia MySQL

Hola, tengo una duda que nose si es un error del motor o es algo que yo hago mal...
tengo 2 tablas:

T1 : Tabla con un solo campo del tipo char(30) con indice comun.
| Nombre |

T2 : Tabla con 2 campos ID del tipo primary autoincrement unsigned y Nombre del tipo char(30) con indice unique.
| ID | | Nombre |

en T1 hay 7580 registros.
en T2 hay 89 registros

cuando ejecuto esta consulta:

Código SQL:
Ver original
  1. SELECT T2.ID AS ID FROM T1 INNER JOIN T2 ON T1.Nombre=T2.Nombre

me devuelve 8602 resultados :

como es posible?? no tendria que retornar 7580? es decir la misma cantidad que la T1??
__________________
Maratón de desafíos PHP Junio - Agosto 2015 en FDW | Reglamento - Desafios
  #2 (permalink)  
Antiguo 06/02/2013, 15:01
Colaborador
 
Fecha de Ingreso: enero-2007
Ubicación: México
Mensajes: 2.097
Antigüedad: 17 años, 3 meses
Puntos: 447
Respuesta: Incoherencia MySQL

Hola NSD:

El problema creo que está en que en tu tabla T1, pues debes tener registros duplicados:

Código MySQL:
Ver original
  1. mysql> SELECT * FROM tabla1;
  2. +--------+
  3. | nombre |
  4. +--------+
  5. | uno    |
  6. | dos    |
  7. | tres   |
  8. +--------+
  9. 3 rows in set (0.00 sec)
  10.  
  11. mysql> SELECT * FROM tabla2;
  12. +------+--------+
  13. | ID   | Nombre |
  14. +------+--------+
  15. |    1 | uno    |
  16. |    2 | dos    |
  17. |    3 | uno    |
  18. |    4 | uno    |
  19. |    5 | tres   |
  20. +------+--------+
  21. 5 rows in set (0.00 sec)
  22.  
  23. mysql> SELECT * FROM tabla1 T1 INNER JOIN tabla2 T2 ON T1.Nombre=T2.Nombre;
  24. +--------+------+--------+
  25. | nombre | ID   | Nombre |
  26. +--------+------+--------+
  27. | uno    |    1 | uno    |
  28. | dos    |    2 | dos    |
  29. | uno    |    3 | uno    |
  30. | uno    |    4 | uno    |
  31. | tres   |    5 | tres   |
  32. +--------+------+--------+
  33. 5 rows in set (0.00 sec)

Aquí no hay problema, pero observa qué pasa si en tu tabla1 hay registros duplicados:

Código MySQL:
Ver original
  1. mysql> SELECT * FROM tabla1;
  2. +--------+
  3. | nombre |
  4. +--------+
  5. | uno    |
  6. | dos    |
  7. | tres   |
  8. | uno    |
  9. +--------+
  10. 4 rows in set (0.00 sec)
  11.  
  12. mysql> SELECT * FROM tabla1 T1 INNER JOIN tabla2 T2 ON T1.Nombre=T2.Nombre;
  13. +--------+------+--------+
  14. | nombre | ID   | Nombre |
  15. +--------+------+--------+
  16. | uno    |    1 | uno    |
  17. | uno    |    1 | uno    |
  18. | dos    |    2 | dos    |
  19. | uno    |    3 | uno    |
  20. | uno    |    3 | uno    |
  21. | uno    |    4 | uno    |
  22. | uno    |    4 | uno    |
  23. | tres   |    5 | tres   |
  24. +--------+------+--------+
  25. 8 rows in set (0.00 sec)

Observa que el resultado son 8 registros, esto es porque todos los registros para el campo uno aparecen duplicados.

Has algo como esto:

Código MySQL:
Ver original
  1. mysql> SELECT nombre, COUNT(nombre)
  2.     -> FROM tabla1
  3.     -> GROUP BY nombre
  4.     -> HAVING COUNT(nombre) > 1;
  5. +--------+---------------+
  6. | nombre | COUNT(nombre) |
  7. +--------+---------------+
  8. | uno    |             2 |
  9. +--------+---------------+
  10. 1 row in set (0.00 sec)

para verificar qué registros tienes duplicados.

saludos
Leo.
  #3 (permalink)  
Antiguo 06/02/2013, 16:48
Avatar de NSD
NSD
Colaborador
 
Fecha de Ingreso: mayo-2012
Ubicación: Somewhere
Mensajes: 1.332
Antigüedad: 11 años, 11 meses
Puntos: 320
Respuesta: Incoherencia MySQL

hola leonardo_josue gracias por responder, pero temo que no es el caso, los datos qu eguardo en T1 son codigos de articulo de ropa, son todos distintos y estan bajo un indice unique (me he equivocado cuando escribi la pregunta lo siento) ambos campos (en las dos tablas) son unicos.

he borrado la tabla, crearla de nuevo, puesto el indice unique y reinsertado los 7580 registros, el resultado no cambio. puede ser que mysql tenga problemas de precicion con tanto volumen de datos? (es la primera vez que manejo tantos registros y pregunto como ignorante)
__________________
Maratón de desafíos PHP Junio - Agosto 2015 en FDW | Reglamento - Desafios
  #4 (permalink)  
Antiguo 06/02/2013, 19:50
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 4 meses
Puntos: 2658
Respuesta: Incoherencia MySQL

MySQL no comete errores en este tipo de cosas. Si el resultado no es el esperado, o los datos están mal, o la consulta estas mal. En tu caso me llama la atención que el campo relacional no parece ser un código, simón el nombre, cosa con probables malas relaciones, o incorrectas.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #5 (permalink)  
Antiguo 07/02/2013, 01:35
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Cáceres
Mensajes: 3.735
Antigüedad: 16 años
Puntos: 300
Respuesta: Incoherencia MySQL

Cita:
los datos qu eguardo en T1 son codigos de articulo de ropa, son todos distintos y estan bajo un indice unique (me he equivocado cuando escribi la pregunta lo siento) ambos campos (en las dos tablas) son unicos.
Realmente, es algo extraño, pues si tienes índices únicos para ese campo char(30) llamado Nombre en ambas tablas, esa consulta solo podría devolverte como máximo 89 registros.
Piensa que unique impide que se repita ningún nombre en ninguna de las dos tablas, e inner join une unos con otros. Si une uno con uno y solo los relacionados, tenemos como mucho los 89 registros y ninguno más. He hecho una prueba y así es. Cosa distinta es que el índice sea compuesto entre el ID y el Nombre, lo que permitiría ingresar registros repetidos en esa tabla. ¿Probaste la consulta de Leo? ¿Las dos tablas tienen la misma codificación?

Última edición por jurena; 07/02/2013 a las 08:40
  #6 (permalink)  
Antiguo 08/02/2013, 10:22
Avatar de NSD
NSD
Colaborador
 
Fecha de Ingreso: mayo-2012
Ubicación: Somewhere
Mensajes: 1.332
Antigüedad: 11 años, 11 meses
Puntos: 320
Respuesta: Incoherencia MySQL

Hola de nuevo gracias por responder, le di muchas vueltas a la consulta de leo y el problema que tenia era que en T2 habia registros duplicados, ya que el indice no era unique como crei (si lo se, es para sopapearme un rato por dejar pasar ese detalle) pero lo he podido solucionar correctamente, ahora tengo un problema con la misma tabla a la ora de insertar los datos :( cuando meto el codigo sql para insertar los 7580 registros juntos se tilda toda la pagina (del phpmyadmin) y nunca inserta los datos, pero si lo hago en tandas de 1000 no hay problema, eso porque puede ocurrir?

muchas gracias por responder


EDITO: Ya encontre la solucion, cuando se insertan muchos datos (mas de 1000) hay que partirlos en bloques de a 1000 y usar esta sentencia
__________________
Maratón de desafíos PHP Junio - Agosto 2015 en FDW | Reglamento - Desafios

Última edición por NSD; 14/02/2013 a las 13:33

Etiquetas: campos, join, registros, resultados, select, tabla
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 21:48.