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

[SOLUCIONADO] Repeticion de resultados en consulta

Estas en el tema de Repeticion de resultados en consulta en el foro de Mysql en Foros del Web. Tal como dice el titulo, me repite los resultados, en lugar de mostrar una sola vez cada campo, lo muestra 3 veces, tengo 2 tablas ...
  #1 (permalink)  
Antiguo 06/03/2013, 02:41
 
Fecha de Ingreso: febrero-2013
Mensajes: 12
Antigüedad: 11 años, 2 meses
Puntos: 0
Repeticion de resultados en consulta

Tal como dice el titulo, me repite los resultados, en lugar de mostrar una sola vez cada campo, lo muestra 3 veces, tengo 2 tablas en la base de datos:

BASKETS

|basketID| |basketSession| |productID| |productPrice| |barcode| |cajero|

PRODUCTS

|productID| |productName| |productImage| |productPrice|

mediante algo de ajax que implementé lo que hago es ingresar por teclado la variable parametro, y me tiene que mostrar los resultados con el barcode coincidente, como verán, el barcode del cual se rije está en la tabla BASKETS mientras que los resultados que quiero mostrar, se encuentran en PRODUCTS, tienen como similitud que ambas tablas tienen la variable ProductID que coinciden siempre, el código que uso para la muestra de los resultados es este:

Código MySQL:
Ver original
  1. SELECT * FROM baskets, products WHERE `barcode`='$parametro'
pero por algún motivo que no me estoy dando cuenta, me muestra todo 3 veces, es decir, existe un basketID único pero me lo repite en los resultados, de esta manera:



de paso puse al lado una marca roja a los campos que deberían ser los correctos según la db, al parecer me muestra un resultado por producto cargado, asi que estimo que si sigo poniendo productos, me va a repetir tantas veces productos haya, debe ser una pavada pero no logro dar con la solución, espero su ayuda, muchas gracias...

Última edición por gnzsoloyo; 06/03/2013 a las 03:27 Razón: Código de programación no permitido en los foros de BBDD.
  #2 (permalink)  
Antiguo 06/03/2013, 09:18
 
Fecha de Ingreso: febrero-2013
Mensajes: 12
Antigüedad: 11 años, 2 meses
Puntos: 0
Respuesta: Repeticion de resultados en consulta

Ups, no sabia que no se podía insertar codigo Php en este foro, efectivamente inserte mas regpiteistros y me repite resultados la misma cantidad de veces que numero de registros
  #3 (permalink)  
Antiguo 06/03/2013, 09:47
Colaborador
 
Fecha de Ingreso: enero-2007
Ubicación: México
Mensajes: 2.097
Antigüedad: 17 años, 3 meses
Puntos: 447
Respuesta: Repeticion de resultados en consulta

Hola tuvieja:

El problema que tienes es que se está realizando un producto cartesiano entre tus tablas ya que no especificas ninguna relación entre las tablas... es decir, debe existir uno o más campos que relacionen los registros de las tablas. Checa este ejemplo. Supongamos que tenemos dos tablas con los siguientes datos:

Código MySQL:
Ver original
  1. mysql> SELECT * FROM tabla1;
  2. +------+-------------+
  3. | id   | descripcion |
  4. +------+-------------+
  5. |    1 | uno         |
  6. |    2 | dos         |
  7. |    3 | tres        |
  8. +------+-------------+
  9. 3 rows in set (0.00 sec)
  10.  
  11. mysql> SELECT * FROM tabla2;
  12. +------+-------------+
  13. | id   | descripcion |
  14. +------+-------------+
  15. |    1 | one         |
  16. |    2 | two         |
  17. |    3 | three       |
  18. +------+-------------+
  19. 3 rows in set (0.00 sec)

Es claro que ambas tablas están relacionadas por el campo id, supongamos ahora que queremos obtener el id = 1 de ambas tablas... tal como lo haces tu sería así:

Código MySQL:
Ver original
  1. mysql> SELECT * FROM tabla1, tabla2
  2.     -> WHERE tabla1.id = 1;
  3. +------+-------------+------+-------------+
  4. | id   | descripcion | id   | descripcion |
  5. +------+-------------+------+-------------+
  6. |    1 | uno         |    1 | one         |
  7. |    1 | uno         |    2 | two         |
  8. |    1 | uno         |    3 | three       |
  9. +------+-------------+------+-------------+
  10. 3 rows in set (0.00 sec)

Esto es justamente un producto cartesiano, es decir, combinar un cada elemento de la tabla1 con todos los elementos de la tabla2. Para evita esto, sólo tienes que poner las relaciones que existen entre las tablas:

Código MySQL:
Ver original
  1. mysql> SELECT * FROM tabla1
  2.     -> INNER JOIN tabla2 ON tabla1.id = tabla2.id
  3.     -> WHERE tabla1.id = 1;
  4. +------+-------------+------+-------------+
  5. | id   | descripcion | id   | descripcion |
  6. +------+-------------+------+-------------+
  7. |    1 | uno         |    1 | one         |
  8. +------+-------------+------+-------------+
  9. 1 row in set (0.02 sec)

Observa que en la cláusula ON tengo esta condición tabla1.id = tabla2.id que es la que relaciona ambas tablas.

Es preferible que utilices JOIN's en lugar del listar las tablas en el FROM separadas por comas. Evita justamente estos productos cartesianos y tiene un mejor rendimiento. aunque también funciona:

Código MySQL:
Ver original
  1. mysql> SELECT * FROM tabla1, tabla2
  2.     -> WHERE tabla1.id = tabla2.id AND tabla1.id = 1;
  3. +------+-------------+------+-------------+
  4. | id   | descripcion | id   | descripcion |
  5. +------+-------------+------+-------------+
  6. |    1 | uno         |    1 | one         |
  7. +------+-------------+------+-------------+
  8. 1 row in set (0.00 sec)

Observa que en el WHERE se agrega la misma condición que en el ON. Te repito que no recomiendo que lo hagas de esta manera, el ejemplo es meramente ilustrativo.

Saludos
Leo.
  #4 (permalink)  
Antiguo 06/03/2013, 09:57
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: Repeticion de resultados en consulta

Aparte de tener en cuenta lo que te explica Leonardo, hay algo que debes considerar:

Técnicamente no existe repetición en la muestra.
En BBDD, un registro se repite cuando todos los valores se repiten en los mismos campos entre dos o más registros. Pero ese no es tu caso.
Lo que parece repetirse es el ID del cesto de compras y de la sesión (basketID y basketSession), el segundo de los cuales no estás mostrando.
Pero ese es el comportamiento normal y esperable en una relación 1:N, donde el conjunto de columnas de la tabla de cardinalidad 1, se repetirá N veces en base a la cantidad de veces que se relaciones con diferentes productos.
Ahora bien, la repetición simula aparecer también, porque el parametro buscado no está discriminando los cestos ni los productos, sino lo que parece ser un codigo de barras, por loque devovlerá todos los casos donde aparezca... que peuden ser miles.
Lo que si te puedo decir es que no es buena práctica usar JOINs implícitos, son bastante proclives a generar errores.
Es mejor usar INNER JOIN:
Código MySQL:
Ver original
  1. FROM baskets B INNER JOIN products P ON B.productID = P.productID
  2. WHERE P.`barcode`='$parametro'
__________________
¿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 06/03/2013, 13:12
 
Fecha de Ingreso: febrero-2013
Mensajes: 12
Antigüedad: 11 años, 2 meses
Puntos: 0
Respuesta: Repeticion de resultados en consulta

la pucha que vale la pena estar vivoooo!! y por tener gente tan buena y que sepa lo que uno no ;) muchas gracias... me puse a indagar respecto a inner join y al final lo solucioné con esto:

("SELECT * FROM baskets INNER JOIN products ON baskets.productID = products.productID WHERE `barcode`='$parametro'");

ahora me voy a autoflagelar por no haberme dado cuenta antes, saludos y GRACIAS!
  #6 (permalink)  
Antiguo 06/03/2013, 13:26
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: Repeticion de resultados en consulta



__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)

Etiquetas: campo, campos, php, repeticion, resultados, select, sql, 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 17:31.