Consulta dentro de un while en php

Espero te encuentres bien, otra vez te escribo para preguntarte sobre php
lo que pasa es que necesito realizar 4 consultas y el resultado de la primera me va a servir para realizar la segunda, pero esta va a estar dentro de un while y así on las otras dos... No se si me entenderás, pero es algo así
sql1 = select*...
...
...
while (mysql_fetch_array....)
{
sql2= select * ....
...
¿Algo así se puede hacer en php?... ¿O también se puede hacer estas consultas por medio de joins?..., si se puede hacer como el ejemplo anterior, me podrías ayudar con la sintaxis, que al parecer ahí me estoy equivocando.. Saludos
que estés bien...
Respuesta
1
Pues creo entenderte... depende mucho para que lo quieres, por ejemplo en un punto de venta donde tienes un maestro de venta (venta), tienes un detalle de venta (detalleVenta) y un catalogo de productos (productos) y quieres obtener la lista de artículos (descripción) que están en cada venta tendrías que hacer algo como esto
sql1 = select* from venta.... 
... 
... 
while ($row1 = mysql_fetch_array....) 
{ 
sql2= "select a.idProducto, cantidad, precio * cantidad as totalUnitario from detalleVenta a join productos b on (a.idProducto = b.idProducto) where a.idVenta = ".$row1['idVenta'];
echo "Detalle de la venta numero ".$row1['idVenta'];
while ($row2 = mysql....){
echo $row2['idProducto'].$row2['cantidad']......
}
}

Claro, esto es un ejemplo, necesitarías ser un poco más especifico... pero si esto te sirve pues ahí lo tienes y si no, pues vuelve a preguntar

1 respuesta más de otro experto

Respuesta
1
La mejor forma de hacerlo es efectivamente por joins, dejar que el Servidor SQL se preocupe de los ciclos. Sin embargo para ayudarte con la sintaxis necesito la estructura de las tablas y el resultado esperado.
Hola Jordi, gracias por responder, te enviare los datos que me pides lo mejor que pueda.
Primero tengo una base de datos, finanzas de la cual te daré las tablas que participan en esta consulta:
Con_Contrato en Decreto
CREATE TABLE finanzas_cas.con_contratos_en_decreto
(
ano_proceso smallint NOT NULL,
codigo_area smallint NOT NULL,
numerodecreto integer NOT NULL,
filanumero smallint NOT NULL,
ano_documento smallint NOT NULL,
numero_documento integer NOT NULL,
fecha_inicio timestamp without time zone NOT NULL,
fecha_termino timestamp without time zone NOT NULL,
monto integer NOT NULL,
rut integer NOT NULL,
nombre character varying(50) NOT NULL,
glosa character varying(100) NOT NULL,
terminal character varying(15) NOT NULL DEFAULT ''::character varying,
fechahora timestamp without time zone NOT NULL,
usuario character varying(15) NOT NULL DEFAULT ''::character varying,
tipotransaccion character(1) NOT NULL DEFAULT ''::bpchar,
CONSTRAINT con_contratos_en_decreto_pk__con_contratos_en__6c190ebb PRIMARY KEY (ano_proceso, codigo_area, numerodecreto, filanumero),
CONSTRAINT fk_con_contratos_en_decreto_con_encabezadodecretos FOREIGN KEY (numerodecreto, codigo_area, ano_proceso)
REFERENCES finanzas_cas.con_encabezadodecretos (numerodecreto, codigo_area, ano_proceso) MATCH SIMPLE
ON UPDATE NO ACTION ON DELETE NO ACTION
)
2.- Con_EncabezadoDecretos
CREATE TABLE finanzas_cas.con_encabezadodecretos
(
codigo_area smallint NOT NULL,
ano_proceso smallint NOT NULL,
numerodecreto integer NOT NULL,
fecha timestamp without time zone NOT NULL,
rut integer NOT NULL,
monto bigint NOT NULL,
fechadepago timestamp without time zone NOT NULL,
glosa character varying(60) NOT NULL,
codigo_banco smallint NOT NULL,
emitidopor character varying(20) NOT NULL,
esderetencion boolean NOT NULL DEFAULT false,
liquido bigint NOT NULL,
montoretencion bigint NOT NULL,
observacion bigint NOT NULL,
fecha_ascii timestamp without time zone NOT NULL,
estado boolean NOT NULL DEFAULT false,
pago_via_transfer boolean NOT NULL DEFAULT false,
codigo_tipo_decreto boolean NOT NULL DEFAULT false,
tiene_cecioncredito boolean NOT NULL DEFAULT false,
rut_cecion integer NOT NULL,
digito_cecion character(1) NOT NULL,
nombre_cecion character varying(80) NOT NULL,
terminal character varying(15) NOT NULL DEFAULT ''::character varying,
fechahora timestamp without time zone NOT NULL,
usuario character varying(15) NOT NULL DEFAULT ''::character varying,
tipotransaccion character(1) NOT NULL DEFAULT ''::bpchar,
CONSTRAINT con_encabezadodecretos_pk__con_encabezadode__2d47b39a PRIMARY KEY (codigo_area, ano_proceso, numerodecreto)
)
3.- EncabezadoComprobantes
CREATE TABLE finanzas_cas.con_encabezadocomprobantes
(
codigo_area smallint NOT NULL,
ano_proceso smallint NOT NULL,
tipocomprobante smallint NOT NULL,
comprobante integer NOT NULL,
fecha timestamp without time zone NOT NULL,
rut integer NOT NULL,
nombre character varying(60) NOT NULL,
glosa character varying(255) NOT NULL,
codigo_direccion smallint NOT NULL,
codigo_departamento smallint NOT NULL,
codigo_documento smallint NOT NULL,
numero_documento real NOT NULL,
codigo_banco smallint NOT NULL,
codigo_centro_costo smallint NOT NULL,
numerocheque real NOT NULL,
fechacheque timestamp without time zone NOT NULL,
ano_decreto integer NOT NULL,
decreto integer NOT NULL,
egreso integer NOT NULL,
anula_devengado integer NOT NULL,
estado_anulado boolean NOT NULL DEFAULT false,
fecha_vencimiento timestamp without time zone NOT NULL,
esdecierre boolean NOT NULL DEFAULT false,
devengado_ano_anterior integer NOT NULL,
terminal character varying(15) NOT NULL DEFAULT ''::character varying,
fechahora timestamp without time zone NOT NULL,
usuario character varying(15) NOT NULL DEFAULT ''::character varying,
tipotransaccion character(1) NOT NULL DEFAULT ''::bpchar,
CONSTRAINT con_encabezadocomprobantes_pk__con_encabezadoco__7a672e12 PRIMARY KEY (codigo_area, ano_proceso, tipocomprobante, comprobante),
CONSTRAINT fk__con_encab__tipoc__7d439abd FOREIGN KEY (tipocomprobante)
REFERENCES finanzas_cas.con_tipocomprobantes (tipocomprobante) MATCH SIMPLE
ON UPDATE NO ACTION ON DELETE NO ACTION
)
4.- TipoComprobante
CREATE TABLE finanzas_cas.con_tipocomprobantes
(
tipocomprobante smallint NOT NULL,
descripcion character varying(50) NOT NULL DEFAULT ''::character varying,
CONSTRAINT con_tipocomprobantes_pk__con_tipocomproba__182c9b23 PRIMARY KEY (tipocomprobante)
)
De la primera tabla necesito rescatar el "ano_proceso" y "numero_decreto", estos datos se los paso desde un form, pero es para que solo me rescate los datos que coinciden con esos parámetros que envío por form y esos dos datos los utilizo como parámetros para la segunda consulta.
De la segunda tabla necesito rescatar "Numerodecreto", "fecha","monto","glosa".
Para la tercera tabla utilizo los parámetros de ano_proceso y numero_decreto para obtener el campo "comprobante" y ademas el campo "tipo_comprobante", este ultimo lo utilizo para consultar la ultima tabla, para obtener el campo "descripcion" ...
El resultado de todo esto es:
"Numerodecreto", "fecha","monto","glosa", "comprobante","tipo_comprobante" y "descripcion"
Espero que me puedas entender toda la información que te envíe, de ante mano muchas gracias, que estés bien.
Muy bien... en la tercera tabla no existe el campo "numero_decreto" pero de todas formas hice la sentencia SQL con joins usando el campo "decreto" que es del mismo tipo...
Si fue un error y de hecho te falto hacer el campo simplemente puedes sustituir donde pongo con_encabezadocomprobantes. Decreto cambias decreto por el nombre del campo que quieras...
En todo caso las variables @a y @b son las que obtienes del form anterior para que puedas filtrar tu consulta.
Cualquier cosa no dudes en preguntar.
PD disculpas por el código todo desordenado.
SELECT con_encabezadodecretos.numerodecreto, con_encabezadodecretos.fecha, con_encabezadodecretos.monto, con_encabezadodecretos.glosa,
con_encabezadocomprobantes.comprobante, con_encabezadocomprobantes.tipocomprobante, con_tipocomprobantes.descripcion
FROM con_tipocomprobantes INNER JOIN
con_encabezadocomprobantes ON con_tipocomprobantes.tipocomprobante = con_encabezadocomprobantes.tipocomprobante INNER JOIN
con_contratos_en_decreto INNER JOIN
con_encabezadodecretos ON con_contratos_en_decreto.codigo_area = con_encabezadodecretos.codigo_area AND
con_contratos_en_decreto.ano_proceso = con_encabezadodecretos.ano_proceso AND
con_contratos_en_decreto.numerodecreto = con_encabezadodecretos.numerodecreto ON
con_encabezadocomprobantes.ano_proceso = con_encabezadodecretos.ano_proceso AND
con_encabezadocomprobantes.decreto = con_encabezadodecretos.numerodecreto
WHERE (con_contratos_en_decreto.ano_proceso = @a) AND (con_contratos_en_decreto.numerodecreto = @b)

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas