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

Porqué me duplica Resultados [consulta mysql]

Estas en el tema de Porqué me duplica Resultados [consulta mysql] en el foro de Bases de Datos General en Foros del Web. @import url("http://static.forosdelweb.com/clientscript/vbulletin_css/geshi.css"); Código MySQL: Ver original SELECT l.nombre , p.nombre , c.nombre , m2 , precio , tp.nombre , telefono , calle_peatonal , id_accesibilidad , ...
  #1 (permalink)  
Antiguo 28/10/2013, 03:00
 
Fecha de Ingreso: septiembre-2012
Mensajes: 149
Antigüedad: 11 años, 7 meses
Puntos: 3
Porqué me duplica Resultados [consulta mysql]

Código MySQL:
Ver original
  1. SELECT l.nombre, p.nombre, c.nombre, m2, precio, tp.nombre, telefono, calle_peatonal, id_accesibilidad, fecha
  2.  
  3. from local l,poblacion p, calle c, telefono_tipo tp


La consulta me muestra 2 registros (3 veces).

He probado con distinct pero no hay manera.

Cuál es el erro?
  #2 (permalink)  
Antiguo 28/10/2013, 05:55
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, 5 meses
Puntos: 2658
Respuesta: Porqué me duplica Resultados [consulta mysql]

Cita:
Iniciado por Pajaranny Ver Mensaje
Código MySQL:
Ver original
  1. SELECT l.nombre, p.nombre, c.nombre, m2,
  2. precio, tp.nombre, telefono, calle_peatonal, id_accesibilidad, fecha
  3. from local l,poblacion p, calle c, telefono_tipo tp

La consulta me muestra 2 registros (3 veces).
He probado con distinct pero no hay manera.
Cuál es el erro?
¿Error?
Técnicamente no hay un "error", sino muy probablemente un defecto de diseño en las tablas y sus relaciones, o bien de entendimiento de lo que en Bases de Datos se llama "registro duplicado".
En Bases de Datos se denomina "registro duplicado" si y sólo si todos y cada uno de los campos entre dos registros dados repiten los valores. Si al menos una de las columnas no es igual a la otra, entonces no existe duplicidad.
¿Se entiende?
Además, debes considerar que si dos tablas dadas tienen una relación 1:N, los datos la tabla de cardinalidad 1 se repetirán en la tabla resultado N veces. Una por cada relación que exista.
Eso no es un error, es el resultado esperado.

Luego, hay que considerar que estás haciendo un JOIN implícito (la coma), que en MySQL implica que se intentará relacionar las tablas por medio de columnas que tengan el mismo nombre. Si cada tabla tiene un campo "ID", por ejemplo, pretenderá juntar los valores iguales, aunque estos no representen el mismo dato...
Ese es el error más común. Por ello se recomienda poner los campos ID con un prefijo o sufijo que identifique la tabla, y que permita a los JOIN implícitos funcionar correctamente.
Pero en ese caso es importante que aquellos campos que sean FK tengan el mismo nombre que la PK a la que se refieren.
Por ejemplo: Si "poblacion" tiene un ID, este debería llamarse algo así como poblacion_id, y la FK de "local" donde se fija la relación con "poblacion", también debe llamarse "poblacion_id". Si esto no ocurre, no se podrá usar un JOIN ,implícito y deberás recurrir al INNER JOIN explícito con su correcta sintaxis.
Por otro lado, si las tablas no tienen campos de igual nombre, se producirá lo que se denomina "producto cartesiano": MySQL intentará juntar cada registro de una tabla, con todos y cada uno de los registros de la otra, y el resultado completo, con cada uno de los registros de la tercera. Y si hay una cuarta... será lo mismo.

¿Se va entendiendo la idea?

Como mínimo tienes como error que no estás indicando la relación exacta entre las tablas que invocas, con lo que estas dejando que sea MySQL el que deba definir cómo las relaciones.
Los DBMS no adivinan las cosas semánticamente. El SQL es un lenguaje declarativo e imperativo. Sólo hará lo que le digas que haga, y sus unicas reglas de inferencia son las del SQL y los algoritmos internos que tiene, que en principio, son los que te describo antes.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #3 (permalink)  
Antiguo 28/10/2013, 06:47
 
Fecha de Ingreso: septiembre-2012
Mensajes: 149
Antigüedad: 11 años, 7 meses
Puntos: 3
Respuesta: Porqué me duplica Resultados [consulta mysql]

Gracias por la info! jajajajja después de leer me di cuenta que las prisas no son buenas y como tu decias:

Había un fallo en el join, que no lo había hecho muahaha.

Solución:

Where id_tabla principal = id_tabla_referencia
AND id_tabla principal = id_tabla_referencia

Que verguenza, gracias y cierren el tema por dios.
  #4 (permalink)  
Antiguo 28/10/2013, 08:03
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, 5 meses
Puntos: 2658
Respuesta: Porqué me duplica Resultados [consulta mysql]

Es mejor que hagas INNER JOIN con sus respectivos ON. Tiene mejor perfomance en MySQL, por cuanto el parser de MySQL no optimiza los WHERE, pero si lo hace con lo que haya en el FROM.
Algo como:
Código MySQL:
Ver original
  1.   l.nombre,
  2.   p.nombre,
  3.   c.nombre,
  4.   m2, precio,
  5.   tp.nombre,
  6.   telefono,
  7.   calle_peatonal,
  8.   id_accesibilidad,
  9.   fecha
  10. FROM local l INNER JOIN poblacion p ON l.local_id = p.local_id
  11.   INER JOIN calle c ON l.calle_id = c.calle_id
  12.   INNER JOIN telefono_tipo tp ON l.telefono_id = tp.telefono_id
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)

Última edición por gnzsoloyo; 29/10/2013 a las 04:04

Etiquetas: registro, resultados
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 02:20.