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

se duplican resultados!

Estas en el tema de se duplican resultados! en el foro de Mysql en Foros del Web. Hola he cambiado mi servidor, el anterior tenia mysql 5.0.67-log el nuevo tiene 5.0.51a-24 resulta que en el anterior servidor tenia una consulta asi la ...
  #1 (permalink)  
Antiguo 15/04/2009, 05:31
 
Fecha de Ingreso: noviembre-2002
Mensajes: 746
Antigüedad: 21 años, 5 meses
Puntos: 6
se duplican resultados!

Hola

he cambiado mi servidor, el anterior tenia mysql 5.0.67-log
el nuevo tiene 5.0.51a-24

resulta que en el anterior servidor tenia una consulta asi la cual devolvia los resultados perfectamente
SELECT *
FROM inmuebles,inmuebles_claves,inmuebles_descripciones ,inmuebles_tipos,tipos,inmuebles_poblaciones,pobla ciones,inmuebles_zonas
WHERE inmuebles.idcliente = 2
AND inmuebles_claves.idinmueble = inmuebles.idinmueble
AND inmuebles_poblaciones.idinmueble = inmuebles.idinmueble
AND poblaciones.idpoblacion = inmuebles_poblaciones.idpoblacion
AND inmuebles_tipos.idinmueble = inmuebles.idinmueble
AND tipos.idtipo = inmuebles_tipos.idtipo
AND inmuebles_zonas.idinmueble = inmuebles.idinmueble
AND inmuebles_descripciones.idinmueble = inmuebles.idinmueble
AND inmuebles.activo =1
ORDER BY inmuebles.precio

en el actual servidor esta misma consulta devuelve el doble de resultados, dos veces el mismo

¿esto es un error de esta version de mysql o es un error de mi consulta que aun estando mal funcionaba perfectamente en una version superior de mysql?


un saludo
  #2 (permalink)  
Antiguo 15/04/2009, 08:32
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: se duplican resultados!

El problema puede deberse a que usas a coma (,) en el FROM, lo que equivale a un NATURAL JOIN, y esto genera un producto cartesiano en alguna de las combinaciones.
En este sentido es siempre preferible usar INNER JOIN, LEFT JOIN o RIGHT JOIN, según se necesite, definiendo cuáles son los campos de relación. JOIN lo que hace es tratar de igualar todos los campos que lleven el mismo nombre en las tablas sometidas a la junta. Como esto puede ser que intente igualar campos del mismo nombre pero con contenidos distintos entre tablas, se produce el error.
El hecho de poner los campos de relación en el WHERE no es suficiente, no solamente porque MySQL no puede optimizar el WHERE, sino porque eso no te asegura que no haya habido duplicación de registros, ya que si el campo pivotado no es el ID que pusiste, la duplicación cumple de todos modos con el WHERE tal y como lo planteas.

Resumiendo:
Lo que debes hacer es:
Código sql:
Ver original
  1. SELECT *
  2. FROM inmuebles INNER JOIN inmuebles_claves USING(idinmueble) inmuebles_descripciones
  3.     INNER JOIN inmuebles_tipos  USING(idinmueble)
  4.     INNER JOIN tipos,inmuebles_poblaciones  USING(idinmueble)
  5.     INNER JOIN poblaciones  USING(idinmueble)
  6.     INNER JOIN inmuebles_zonas  USING(idinmueble)
  7. WHERE inmuebles.idcliente = 2 AND inmuebles.activo =1;
  8. ORDER BY inmuebles.precio

La cláusula USING funciona como el ON campo1 = campo2 cuand los campos en ambas tablas tienen el mismo nombre.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
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:40.