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

Se me multiplica la consulta de 2 tablas

Estas en el tema de Se me multiplica la consulta de 2 tablas en el foro de Mysql en Foros del Web. Hola que tal, tengo un pequenio problema al hacer una consulta a 2 tablas de mi base de datos. Al realizar la consulta se me ...
  #1 (permalink)  
Antiguo 27/06/2012, 08:31
 
Fecha de Ingreso: julio-2005
Mensajes: 7
Antigüedad: 18 años, 9 meses
Puntos: 0
Se me multiplica la consulta de 2 tablas

Hola que tal,

tengo un pequenio problema al hacer una consulta a 2 tablas de mi base de datos.

Al realizar la consulta se me repiten los campos 2 veces, es ddecir :

Código:
35 	Y2K 	Batman 	1.00 	1000.00 	1120.00 	aprobado
34 	h1n1 	y2k 	1.00 	1000.00 	1120.00 	APROBADO
35 	Y2K 	Batman 	1.00 	1000.00 	1120.00 	aprobado
34 	h1n1 	y2k 	1.00 	1000.00 	1120.00 	APROBADO
el codigo que utilizo es este:

Código:
<?php 
// conectar al servidor

$connect = mysql_connect ("localhost","nimopart_invoice","invoices");

//conectar bd

mysql_select_db ("nimopart_invoices");

// buscar en bd
$query = mysql_query ( "SELECT * FROM mcb_invoice_items, mcb_invoice_item_amounts WHERE invoice_item_custom_1 = 'aprobado' ");

//atrapar resultados y mostrar

 WHILE ($columnas = mysql_fetch_array($query)):

$invoice_id = $columnas ['invoice_id'];
$item_name = $columnas ['item_name'];
$item_description = $columnas ['item_description'];
$item_qty = $columnas ['item_qty'];
$item_price = $columnas ['item_price'];
$item_total = $columnas ['item_total'];
$invoice_item_custom_1 = $columnas ['invoice_item_custom_1'];


echo "  
    <tr>  
      <td width='150'>".$columnas['invoice_id']."</td>  
      <td width='150'>".$columnas['item_name']."</td>  
      <td width='150'>".$columnas['item_description']."</td>
          <td width='150'>".$columnas['item_qty']."</td>
          <td width='150'>".$columnas['item_price']."</td>
          <td width='150'>".$columnas['item_total']."</td>
           <td width='150'>".$columnas['invoice_item_custom_1']."</td>     

    </tr>  
"; 




  endwhile;
?>
que puedo hacer para que no se me multiplique?, los nombres de las tablas son: mcb_invoice_items y mcb_invoice_item_amounts
  #2 (permalink)  
Antiguo 27/06/2012, 08: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: Se me multiplica la consulta de 2 tablas

Código MySQL:
Ver original
  1. FROM mcb_invoice_items, mcb_invoice_item_amounts
  2. WHERE invoice_item_custom_1 = 'aprobado' "
No estás poniendo las condiciones del JOIN, por lo que se está generando por lo menos un producto cartesiano.

Esto es una aproximación:
Código MySQL:
Ver original
  1. FROM mcb_invoice_items I INNER JOIN mcb_invoice_item_amounts A ON I.invoice_id = A.invoice_id
  2. WHERE invoice_item_custom_1 = 'aprobado'

Pero el esquema de relaciones no es claro, porque una factura tiene dos partes (cabecera y detalle), más la relación con los productos, clientes y otros datos. Y el que pones no queda claramente definido ´cómo es.

¿Podrías postear la estructura y relaciones de las tablas involucradas?
__________________
¿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 27/06/2012, 09:08
 
Fecha de Ingreso: julio-2005
Mensajes: 7
Antigüedad: 18 años, 9 meses
Puntos: 0
Respuesta: Se me multiplica la consulta de 2 tablas

OK, leí que las comas "," hacían el papel de JOIN.

la primera tabla ( mcb_invoice_items)

invoice_item_id , item_name ,item_description, item_qty , item_price , invoice_item_custom_1

la segunda tabla (mcb_invoice_item_amounts) tiene estos campos:
invoice_item_amount_id, invoice_item_id , item_subtotal , item_tax, item_total

l
  #4 (permalink)  
Antiguo 27/06/2012, 09:12
Colaborador
 
Fecha de Ingreso: enero-2007
Ubicación: México
Mensajes: 2.097
Antigüedad: 17 años, 4 meses
Puntos: 447
Respuesta: Se me multiplica la consulta de 2 tablas

Las comas hacen la función del JOIN, pero no si no especificas sobre qué campos es la unión entonces se realiza el producto cartesiano:

Código MySQL:
Ver original
  1. mysql> SELECT * FROM tablaA;
  2. +------+-------------+
  3. | idA  | descripcion |
  4. +------+-------------+
  5. |    1 | uno         |
  6. |    2 | dos         |
  7. +------+-------------+
  8. 2 rows in set (0.00 sec)
  9.  
  10. mysql> SELECT * FROM tablaB;
  11. +------+-------------+
  12. | idB  | descripcion |
  13. +------+-------------+
  14. |    1 | one         |
  15. |    2 | two         |
  16. +------+-------------+
  17. 2 rows in set (0.00 sec)
  18.  
  19. mysql> #Producto cartesiano
  20. mysql> SELECT * FROM tablaA, tablaB;
  21. +------+-------------+------+-------------+
  22. | idA  | descripcion | idB  | descripcion |
  23. +------+-------------+------+-------------+
  24. |    1 | uno         |    1 | one         |
  25. |    2 | dos         |    1 | one         |
  26. |    1 | uno         |    2 | two         |
  27. |    2 | dos         |    2 | two         |
  28. +------+-------------+------+-------------+
  29. 4 rows in set (0.00 sec)
  30.  
  31. mysql> SELECT * FROM tablaA INNER JOIN tablaB;
  32. +------+-------------+------+-------------+
  33. | idA  | descripcion | idB  | descripcion |
  34. +------+-------------+------+-------------+
  35. |    1 | uno         |    1 | one         |
  36. |    2 | dos         |    1 | one         |
  37. |    1 | uno         |    2 | two         |
  38. |    2 | dos         |    2 | two         |
  39. +------+-------------+------+-------------+
  40. 4 rows in set (0.00 sec)

En lo particular recomiendo siempre utilizar JOIN's, pero sea que utilices comas o JOINS DEBES ESPECIFICAR EL CRITERIO DE UNION EN CADA CASO.

Código MySQL:
Ver original
  1. mysql> SELECT * FROM tablaA, tablaB
  2.     -> WHERE tablaA.idA = tablaB.idB;
  3. +------+-------------+------+-------------+
  4. | idA  | descripcion | idB  | descripcion |
  5. +------+-------------+------+-------------+
  6. |    1 | uno         |    1 | one         |
  7. |    2 | dos         |    2 | two         |
  8. +------+-------------+------+-------------+
  9. 2 rows in set (0.00 sec)
  10.  
  11. mysql>
  12. mysql> SELECT * FROM tablaA
  13.     -> INNER JOIN tablaB ON tablaA.idA = tablaB.idB;
  14. +------+-------------+------+-------------+
  15. | idA  | descripcion | idB  | descripcion |
  16. +------+-------------+------+-------------+
  17. |    1 | uno         |    1 | one         |
  18. |    2 | dos         |    2 | two         |
  19. +------+-------------+------+-------------+
  20. 2 rows in set (0.00 sec)

Saludos
Leo.
  #5 (permalink)  
Antiguo 27/06/2012, 09:14
 
Fecha de Ingreso: julio-2005
Mensajes: 7
Antigüedad: 18 años, 9 meses
Puntos: 0
Respuesta: Se me multiplica la consulta de 2 tablas

Gracias por la ayuda me hiciste ver algo que no veía, lo he logrado cambiando esto:

Código:
$query = mysql_query ( "SELECT * FROM mcb_invoice_items, mcb_invoice_item_amounts WHERE invoice_item_custom_1 = 'aprobado' ");
por esto:

Código:
$query = mysql_query ( "SELECT * FROM mcb_invoice_items, mcb_invoice_item_amounts WHERE mcb_invoice_items.invoice_item_id = mcb_invoice_item_amounts.invoice_item_id and  invoice_item_custom_1 = 'aprobado' ");
espero le sirva a alguien más
  #6 (permalink)  
Antiguo 27/06/2012, 09:17
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: Se me multiplica la consulta de 2 tablas

Borrada la parte que ya te explicó Leo (se me adelantó )
Tengo la impresión de que el diseño tiene algún error, pero para estar seguro: ¿Qué representa la tabla "mcb_invoice_item_amounts"? ¿La cabecera de la factura u otra cosa?
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #7 (permalink)  
Antiguo 27/06/2012, 09:20
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: Se me multiplica la consulta de 2 tablas

Consejo: No uses la coma, a pesar de lo que dicen los manuales. Acostúmbrate a usar INNER JOIN, LEFT JOIN o RIGHT JOIN. De ese modo lograrás mejor control sobre lo que haces.
Y preferentemente no uses el asterisco (*). Especifica qué campos usarás, de ese modo no traerás datos "basura" al proceso.
__________________
¿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; 27/06/2012 a las 09:29
  #8 (permalink)  
Antiguo 27/06/2012, 09:27
 
Fecha de Ingreso: julio-2005
Mensajes: 7
Antigüedad: 18 años, 9 meses
Puntos: 0
Respuesta: Se me multiplica la consulta de 2 tablas

El diseño puede que tenga un error pero en este caso por suerte no es importante, solo interesa tener esos datos y ya,no es algo que va a tener acceso el publico. solo alguien interno.


Muchas gracias!

Etiquetas: php, select, sql, tabla, tablas, campos
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 12:34.