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

por ke me repite resultado la consulta

Estas en el tema de por ke me repite resultado la consulta en el foro de Bases de Datos General en Foros del Web. hola amigos tengo un problema con esta consulta ya que me repite los resultados al ejecutarla..tengo 3 registros en cada tabla y me los repite ...
  #1 (permalink)  
Antiguo 05/08/2004, 00:26
 
Fecha de Ingreso: febrero-2004
Ubicación: horcon
Mensajes: 133
Antigüedad: 20 años, 3 meses
Puntos: 1
por ke me repite resultado la consulta

hola amigos tengo un problema con esta consulta ya que me repite los resultados al ejecutarla..tengo 3 registros en cada tabla y me los repite 3 veces cada registro.... la consulta la pruebo en el phpmyadmin y me da eso como resultado..
aqui les dejo la consulta para que le vean..

Código PHP:
 SELECT  DISTINCT productos_propio.marcaproductos_propio.patenteproductos_consignado.marca AS marca_con
FROM productos_propio
INNER    JOIN productos_consignado
WHERE productos_propio
.tipo_vehiculo =  'Automovil' AND productos_propio.estado =  'En venta' AND productos_consignado.tipo_vehiculo =  'Automovil' AND productos_consignado.estado =  'En venta' 
saludos a todos..
__________________
pato
  #2 (permalink)  
Antiguo 05/08/2004, 00:47
 
Fecha de Ingreso: junio-2004
Ubicación: Castellón, España
Mensajes: 98
Antigüedad: 19 años, 10 meses
Puntos: 0
Tienes que tener un campo que relacione las dos tablas e incluir la relación en el Argumento ON de la clausula FROM. Ej:

SELECT DISTINCT productos_propio.marca, productos_propio.patente, productos_consignado.marca AS marca_con FROM productos_propio LEFT JOIN productos_consignado ON productos_propio.Campo_relacion= productos_consignado.Campo_relacion WHERE productos_propio.tipo_vehiculo = 'Automovil' AND productos_propio.estado = 'En venta'

Espero que esto te sirva.
  #3 (permalink)  
Antiguo 05/08/2004, 02:19
Avatar de Vice  
Fecha de Ingreso: agosto-2003
Mensajes: 613
Antigüedad: 20 años, 9 meses
Puntos: 2
Lo que te pone Atzeneta es totalmente acertado, pero por aclarar más te diré que simpre, SIEMPRE (se me ocurren pocas excepciones a esta regla), que cruces dos tablas tienes que poner las condiciones de cruce entres dichas tablas, sino lo que consigues es un producto cartesiado de ambas tablas, lo cual te lleva a que si tienes una tabla con n registros y otra con m registros, obtendras un resultado de N x M filas.
Este es un error común cuando se empieza a trabajar con el SQL y, aún teniendo experiencia, de vez en cuando no se ponen bien las condiciones y aparecen los resultado repetidos no deseado.
Un saludo.
  #4 (permalink)  
Antiguo 05/08/2004, 11:33
 
Fecha de Ingreso: febrero-2004
Ubicación: horcon
Mensajes: 133
Antigüedad: 20 años, 3 meses
Puntos: 1
miren amigos segui sus comentarios haciendo estas dos consulta...

SELECT DISTINCT productos_propio.marca,productos_consignado.marca AS marca_con FROM productos_propio LEFT JOIN productos_consignado ON productos_propio.tipo_vehiculo= productos_consignado.tipo_vehiculo WHERE productos_propio.tipo_vehiculo = 'Automovil' and productos_consignado.tipo_vehiculo='Automovil'

**************************************************
SELECT DISTINCT productos_propio.marca,productos_consignado.marca AS marca_con FROM productos_propio LEFT JOIN productos_consignado ON productos_propio.tipo_vehiculo= productos_consignado.tipo_vehiculo WHERE productos_propio.tipo_vehiculo = 'Automovil'

pero con las dos llego al mismo resultado que me repite los registros osea como dice VICE Obtengo el resultado de NxM filas..

ademas el registro tipo_vehiculo puede ser Motocicleta o Automovil pero eso esta especificado en el WHERE productos_propio.tipo_vehiculo = 'Automovil'

puede haber una forma de hacer la consulta si repetir registros.......
saludos y gracias
__________________
pato
  #5 (permalink)  
Antiguo 06/08/2004, 07:02
Avatar de Vice  
Fecha de Ingreso: agosto-2003
Mensajes: 613
Antigüedad: 20 años, 9 meses
Puntos: 2
Con eso que tu has puesto no obtienes el producto cartesian NxM, sino que tienes todas las filas de la primera tabla (left join) tengan o no tenga cruce en la segunda tabla y cumplan las condiciones del where. De la segunda tabla sólo te muestra las que tengan cruce con la primera y cumplan las condiciones.
Quita el "left" del "left join" para que te de el resultado que quieres.
  #6 (permalink)  
Antiguo 06/08/2004, 11:16
 
Fecha de Ingreso: febrero-2004
Ubicación: horcon
Mensajes: 133
Antigüedad: 20 años, 3 meses
Puntos: 1
hola VICE le quite el left del left join y el resultado que obtengo es que me repite dos veces los registros de cada tabla.......
a todo esto mi base de datos es mysql.. que se podria hacer .. probe con el comando UNION y me da el resultado que deseo pero mi proveedor de hosting no tiene la version de mysql que soporta ese comando y me dijo ke todavia no la actualizaran para que se pueda usar el comando UNION...
__________________
pato
  #7 (permalink)  
Antiguo 08/08/2004, 15:53
 
Fecha de Ingreso: febrero-2004
Ubicación: horcon
Mensajes: 133
Antigüedad: 20 años, 3 meses
Puntos: 1
mmm..tendra solucion este problema sin ocupar uniones amigos
__________________
pato
  #8 (permalink)  
Antiguo 09/08/2004, 00:25
 
Fecha de Ingreso: junio-2004
Ubicación: Castellón, España
Mensajes: 98
Antigüedad: 19 años, 10 meses
Puntos: 0
Yo no entiendo nada, ¿Cómo te puede duplicar registros?¿Te has asegurado que no los tienes duplicados en la tabla de origen?
Otra cosa, ¿Por qué no usas como campo de relación un campo codificado?
  #9 (permalink)  
Antiguo 09/08/2004, 01:18
Avatar de Vice  
Fecha de Ingreso: agosto-2003
Mensajes: 613
Antigüedad: 20 años, 9 meses
Puntos: 2
Código:
SELECT DISTINCT productos_propio.marca,productos_consignado.marca AS marca_con 
FROM productos_propio JOIN productos_consignado ON productos_propio.tipo_vehiculo= productos_consignado.tipo_vehiculo 
WHERE productos_propio.tipo_vehiculo = 'Automovil' and productos_consignado.tipo_vehiculo='Automovil'

************************************************** 
SELECT DISTINCT productos_propio.marca,productos_consignado.marca AS marca_con 
FROM productos_propio JOIN productos_consignado ON productos_propio.tipo_vehiculo= productos_consignado.tipo_vehiculo 
WHERE productos_propio.tipo_vehiculo = 'Automovil'
Para empezar, ¿a que te refieres a que saca duplicados?.
Por otro lado, el campo "tipo_vehículo" no parece que pueda ser un buen elemento de cruce de ambas tablas, pues no será ni por asomo una clave única y seguramente habrá más de un registro en cada tabla con igual "tipo_vehículo".
Creo, llegados a este punto, que para poder ayudarte es conveniente que pongas aquí la estructura de las tablas y que expongas claramente que es lo que quieres obtener.
  #10 (permalink)  
Antiguo 09/08/2004, 01:46
 
Fecha de Ingreso: abril-2003
Ubicación: Madrid
Mensajes: 707
Antigüedad: 21 años, 1 mes
Puntos: 0
Que te repita las filas. es lo normal, tal y como parece que están las tablas.

Estás sacando información de dos tablas, y tal y como pides lo datos, deberías tener un campo que relacione ambas tablas, por ejemplo, una tabla de tipos de vehículos y la tabla de vehículos, relacionarías ambas por el campo tipo de vehiculo que está en ambas tablas.

Ahora bien, si son dos tablas que no tienen nada que ver, y lo quieres es obtener información de ambas, filtrando por un mismo campo, eso no quiere decir que puedas sacarlas juntas... quizá la solución sería sacarlas separadas, o hacer una UNION, como comentaba cucox.

Es un poco dificil con sólo unas lineas y unos comentarios de lo que sucede sin saber mucho más, cuál puede ser el problema, y mucho más dificil intentar encontrar una solución

Saludos
  #11 (permalink)  
Antiguo 09/08/2004, 05:53
 
Fecha de Ingreso: junio-2004
Ubicación: Castellón, España
Mensajes: 98
Antigüedad: 19 años, 10 meses
Puntos: 0
Estoy totalmente de acuerdo con Vice, lo que le sucede a cucox es totalmente ilógico. Para poder ayudarle sería necesario conocer la estructura de las tablas y los registros que hay en ellas.

De todas formas, en mi opinión, deberías tener un tabla de tipos de vehículo con una clave única para cada registro. Después deberías estudiar el tipo de relación JOIN, INNER JOIN..., teniendo en cuenta lo siguiente:

INNER JOIN: Especifica que se devuelven todos los pares de filas coincidentes. Descarta las filas no coincidentes de las dos tablas. Éste es el valor predeterminado si no se especifica ningún tipo de combinación.
LEFT: Especifica que todas las filas de la tabla izquierda que no cumplan la condición de combinación se incluyan en el conjunto de resultados, con las columnas de la otra tabla establecidas en NULL, además de todas las filas devueltas por la combinación interna.
RIGHT: Especifica que todas las filas de la tabla derecha que no cumplan la condición de combinación se incluyan en el conjunto de resultados, con las columnas de la otra tabla establecidas en NULL, además de todas las filas devueltas por la combinación interna.
CROSS JOIN: Especifica el producto resultante de dos tablas.

La consulta podría quedar algo así:

Código:
...FROM productos_propio INNER JOIN tabla_vehiculos ON 
productos_propio.clave_unica = tabla_vehiculos.clave_unica INNER JOIN 
productos_consignado ON tabla_vehiculos.clave_unica = 
productos_consignado.clave_unica WHERE tabla_vehiculos.tipo_vehiculo 
= 'Automovil'
Haciéndolo de esta forma es imposible que te duplique ningún registro.
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 17:07.