Foros del Web » Programando para Internet » PHP »

Me podrian ayudar con esta query?

Estas en el tema de Me podrian ayudar con esta query? en el foro de PHP en Foros del Web. Bueno, la cosa es asi. Tengo que hacer una consulta que tiene que mostrar los consumos de los clientes. Tengo 2 tablas confilctivas: la primera ...
  #1 (permalink)  
Antiguo 21/10/2004, 20:00
DracoTronick
Invitado
 
Mensajes: n/a
Puntos:
Me podrian ayudar con esta query?

Bueno, la cosa es asi.
Tengo que hacer una consulta que tiene que mostrar los consumos de los clientes. Tengo 2 tablas confilctivas: la primera "PEDIDO" guarda el ID del cliente que hizo el pedido y la fecha, "DETALLE" guarda que productos consumio y que cantidad.
El codigo que hice es bastante simple y es:

Código PHP:
//Busca los pedidos pertenecientes a este cliente--
$result mysql_query ("SELECT * FROM pedido WHERE IdCliente='$ncliente%'");
$numeroRegistros=mysql_num_rows($result);
while(
$r=mysql_fetch_array($result))
{    
   
$IdCliente=$r["IdCliente"];
   
$IdPedido=$r["IdPedido"];
   
$PedidoFecha=$r["Fecha"];
}
//Busca el detalle de los pedidos que resultaron de la busqueda anterior--
$result mysql_query ("SELECT * FROM detalle WHERE IdPedido LIKE '$IdPedido'");
$numeroRegistros=mysql_num_rows($result);
while(
$r=mysql_fetch_array($result))
{    
   
$IdDetallePedido=$r["IdDetallePedido"];
   
$IdProducto=$r["IdProducto"];
   
$Cantidad=$r["Cantidad"];
}
//Toma el importe y hace el calculo de los productos pedidos--
$result mysql_query ("SELECT * FROM productos WHERE IdProducto LIKE '$IdProducto'");
$numeroRegistros=mysql_num_rows($result);
while(
$r=mysql_fetch_array($result))
{    
   
$ProductoNombre=$r["Producto"];
   
$ProductoImporte=$r["Importe"];
   
$TotalProducto $ProductoImporte*$Cantidad
El problema de esto es que solo me muestra el ultimo registro de "DETALLE", no todos los que deberia, como hago para solucionar esto??
Muchas gracias Srs Programadores :)
  #2 (permalink)  
Antiguo 21/10/2004, 22:39
Avatar de HiTek  
Fecha de Ingreso: noviembre-2003
Ubicación: LF, Santiago.Chile
Mensajes: 217
Antigüedad: 20 años, 4 meses
Puntos: 0
holas draco, 2 preguntas...
1-¿PQ usas Like, no te serñia mas seguro para tus consultas ralizarlas igualando los ID?
$result = mysql_query ("SELECT * FROM detalle WHERE IdPedido LIKE '$IdPedido'");

2-¿haz impreso en pantalla la variable $numeroRegistros para saber cuantos productos en detalle te devuelve tu consulta?
$numeroRegistros=mysql_num_rows($result);


salu2...
  #3 (permalink)  
Antiguo 22/10/2004, 05:17
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 22 años, 3 meses
Puntos: 129
Esto no es del todo correcto:
Código PHP:
$result mysql_query ("SELECT * FROM pedido WHERE IdCliente='$ncliente%'"); 
Los "comodines" como % sólo se usan en sentencias SQL: LIKE .. no en ese caso .. Deberías hacer:
result = mysql_query ("SELECT * FROM pedido WHERE IdCliente='$ncliente'");


Ya puestos:

-¿PQ usas Like, no te serñia mas seguro para tus consultas ralizarlas igualando los ID?
$result = mysql_query ("SELECT * FROM detalle WHERE IdPedido LIKE '$IdPedido'");

mejor:

-¿PQ usas Like, no te serñia mas seguro para tus consultas ralizarlas igualando los ID?
Código PHP:
$result mysql_query ("SELECT * FROM detalle WHERE IdPedido='$IdPedido'"); 
Un saludo,
  #4 (permalink)  
Antiguo 22/10/2004, 05:17
DracoTronick
Invitado
 
Mensajes: n/a
Puntos:
Hola!
Respuesta 1:
Tenes razon, en realidad ni me habia dado cuenta de ese detalle. Gracias

Respuesta 2:
Si lo habia echo, pero en realidad no lo necesito.
Te pongo un ejemplo
Supon que el cliente 1 ingresa al sitio, la primer busqueda tiene como resultado el idpedido 1, 5, 8 y 10. Hasta aca todo perfecto, pero la busqueda dentro de detalle solo me muestra el ultimo registro con el idpedido 10, aunque este tenga varios con ese id

A ver...si ya se, es complicadicimo esto

Código PHP:
Tabla PEDIDO
IdPedido  
:: Fecha  :: IdCliente
    1        01
/01/00         1
    5        02
/01/00         1
etc
... 
Dentro de DETALLE tendria algo asi

Código PHP:
IdDetallePedido :: IdPedido :: IdProducto :: Cantidad 
     1                 1             2           3
     2                 1             5           2
     3                 1             3           1
     10                5             1           3
[...]
      
20               10            5           2
      21               10            2           1
      22               10            9           7
<---El unico que me muestra es este ultimo 
Hasta luego y gracias!

Última edición por DracoTronick; 22/10/2004 a las 05:26
  #5 (permalink)  
Antiguo 22/10/2004, 06:04
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 22 años, 3 meses
Puntos: 129
Ok ....

La consulta SQL que haces es correcta .. Pero .. ¿donde haces el "echo" de tu "detalle" (campos y sus valores):

Código PHP:
//Busca el detalle de los pedidos que resultaron de la busqueda anterior-- 
$result mysql_query ("SELECT * FROM detalle WHERE IdPedido LIKE '$IdPedido'"); 
$numeroRegistros=mysql_num_rows($result); 
while(
$r=mysql_fetch_array($result)) 
{     
   
$IdDetallePedido=$r["IdDetallePedido"]; 
   
$IdProducto=$r["IdProducto"]; 
   
$Cantidad=$r["Cantidad"]; 

  
// aquí deberías hacer tu echo .. 
  
echo $IdProducto." --> ".$Cantidad."<br>";

Si no lo quieres hacer ahí .. (el echo de tus registros) tendrias que montarte un array para recorrerlo (con otro bucle) en otra posición de tu código .. Pero, ya que ahí recorres tu "record-set" obtenido .. hazo ahí mismo.

Un saludo,
  #6 (permalink)  
Antiguo 22/10/2004, 06:50
DracoTronick
Invitado
 
Mensajes: n/a
Puntos:
Hola
El echo de los campos no lo puse pq no lo crei necesario
Es una tabla con 5 columnas, horizontal
Me habian dicho hace un tiempo que podia usar el comando while pero la verdad que no entendi :p

Gracias !!
  #7 (permalink)  
Antiguo 22/10/2004, 07:27
 
Fecha de Ingreso: enero-2004
Mensajes: 235
Antigüedad: 20 años, 3 meses
Puntos: 0
Con una sóla sentencia sql tienes suficiente:

select sum(pr.importe * d.cantidad) as total from pedido as p, detalle as d, productos as pr where p.idcliente=1 and p.idpedido = d.iddetallepedido and d.idproducto = pr.idproducto

Ten en cuenta que al agmentar los datos de las 3 tablas, irà más lento.
Es una setencia SQL que se podria mejorar.
  #8 (permalink)  
Antiguo 22/10/2004, 10:10
DracoTronick
Invitado
 
Mensajes: n/a
Puntos:
Cluster, corregime si entendi mal
Entonces en cada celda de la tabla que tengo para mostrar los resultados haga la consulta correspondiente y su echo? No todo de corrido como lo habia echo yo?

Algo asi:
Celda de fecha
Consulta fecha y echo fecha
Celda de producto
Consulta prod y echo prod.
y asi sucesivamente?
  #9 (permalink)  
Antiguo 22/10/2004, 10:23
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 22 años, 3 meses
Puntos: 129
Si estamos hablando que vas a generar una tabla (HTML) con esos datos .. tendrás que ir montanto tu tabla HTML dinámicamente .. es decir . .en tu "echo" que muestras el valor de tu campo . .también debes componer en ese bucle (en el interior) los respectivos <td>.. </td> .. <tr> ... </tr> que correspondan.

Un saludo,

PD: usa el tipo de consultas SQL que te propone jmaribau simplificaras mucho la taréa. Sólo tendrías que usar un "while()" para todo prácticamente .. Pues esa consultas SQL "compuesta" donde intervienen tus N tablas obtiene un sólo "record-set" con todos esos datos de todas esas tablas que llamas y bajo las condiciones que especificas.
  #10 (permalink)  
Antiguo 22/10/2004, 10:33
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 22 años, 3 meses
Puntos: 129
Un ejemplo:

Código PHP:
echo "<table>";
$result mysql_query ("SELECT * FROM detalle WHERE IdPedido LIKE '$IdPedido'"); 
$numeroRegistros=mysql_num_rows($result); 
while(
$r=mysql_fetch_array($result)) 
{      
   
$IdDetallePedido=$r["IdDetallePedido"]; 
   
$IdProducto=$r["IdProducto"]; 
   
$Cantidad=$r["Cantidad"]; 

  
// aquí deberías hacer tu echo .. 
  
echo "<tr>"// inicio "fila"
  
echo "<td>".$IdProducto."</td>"// celda1
  
echo "<td>".$cantidad."</td>"// celda2
  
echo "</tr>\n; // fin "fila"

echo "
</table>"; 
Pero .. si usas un editor visual tipo "Dreamweaver" por ejemplo .. podrias hacer algo tipo:

Código PHP:
<table width="75%" border="1">
<?
$result 
mysql_query ("SELECT * FROM detalle WHERE IdPedido LIKE '$IdPedido'"); 
$numeroRegistros=mysql_num_rows($result); 
while(
$r=mysql_fetch_array($result)) {
?>
  <tr>
    <td><? echo $IdProducto?></td>
    <td><? echo $cantidad ?></td>    
  </tr>
<?
}
?>
</table>
Así lo veras de forma "visual" como queda tu tabla y la podrías diseñar mejor ..

Un saludo,
  #11 (permalink)  
Antiguo 22/10/2004, 11:47
DracoTronick
Invitado
 
Mensajes: n/a
Puntos:
Me parece que no me entendiste...

Ahora lo tengo echo como vos decis. Tengo toda la consulta y al final genero la tabla dinamicamente con los titulos de las columnas, con un fondo de color, etc, pero sin el while()
Me podrias explicar un poco como es la consulta que sugiere jmaribau? No entiendo que son esos "p", "d" que pone adelante de las tablas.
Y tambien, como muestro los datos que eso genere? con "echo"?

Muchas gracias y perdon por ser tan ignorante :p
  #12 (permalink)  
Antiguo 22/10/2004, 13:25
 
Fecha de Ingreso: enero-2004
Mensajes: 235
Antigüedad: 20 años, 3 meses
Puntos: 0
Las 'p','d','pr' son unos alias de los nombre de las tablas, i sirrven para diferenciar los nombre de los campos cuando estos son los mismo en diferentes tablas. Fixate que la tabla detalles tiene un campo con el nombre 'idproducto', que también existe en la tabla productos.

Aqui lo tienes traducido :

select sum(producto.importe * detalle.cantidad) as total from pedido, detalle, producto where pedido.idcliente=1 and pedido.idpedido = detalle.iddetallepedido and detalle.idproducto = producto.idproducto

Lo único que he hecho es cambiar las 'p' por pedido, las 'd' por detalles, i los 'pr' por productos.

Por cierto si quieres obtener los campos sólo tienes que substituir el sum() por asterisco.

Un saludo.
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:40.