New question

Question:

Date: 17-09-2019 12:04:03 (In Spanish)

Pregunta tecnica de diseño de consulta[Unresolved]

Estoy desarrollando un sistema basico de gestion para despensa. los abm y select mas basicos van bien.

Pero quiero mostrar y/o exportar pdf con resumen de cuenta corriente de un cliente y quiero poner los pagos en la misma tabla que el detalle de productos comprados, es mas comodo de ver que teniendo dos tablas separadas.

Entonces la duda es si es correcto, (creeria que no por tiempo y recursos) cruzar todas las tablas de la base de datos para obtener un solo array usando LEFT JOIN.
Mi estructura es la siguiente:

PAGO(idpago,fecha,idcliente,monto)
DETALLETICKET(idticket,idproducto,cantidad,preciou);

el idcliente lo tengo en la tabla ticket.
Trabajo con Mysql y php y ademas uso DataTables de JQuery.

Una consulta como la que describo arriba seria:
public function deuda($idc) 	{
		try
		{
            $conexion = Conexion::singleton_conexion();
			 $queryventas="SELECT * FROM ticket left join detalleticket on ticket.idticket=detalleticket.idticket left join producto on producto.idproducto=detalleticket.idproducto left join cliente on cliente.idcliente=ticket.idc left join pago on pago.idcliente=cliente.idcliente where ticket.idc=".$idc.";";


           $array=$conexion->query($queryventas);

			return $array;
         
		          
		}
		catch(Exception $e)
		{
			die($e->getMessage());
		}
	}


¿Que opinan al respecto?
Tags: PHP Votes: 0 - Answers: 2 - Views: 8 Share on: Google Facebook Twitter LinkedIn Link
 

Answers:

  • Date: 18-09-2019 15:15:08 Primero que nada debiste identificar como llave el idcliente en la tabla tickets.
    Segundo: dependiente a que forma normal este tus tablas, deben tener relacion ambas (desde la segunda, y como lo dices si lo tienen)
    Entonces:
    Ya estan indexadas, esto implica que no requieres un left join, sino por practicidad y rapides, el from ticket, detalleticket, producto, cliente .
    Esto por que:
    TODO ticket, debe llevar un cliente (Asi sea general le debiste asignar 1)
    TODO Ticket, tiene como minimo un producto
    Todo Ticket, debe llevar su detalle
    En caso de que alguno le falte, entonces algo esta mal en la logica del sistema, pues no puedes crear un ticket sin cliente, ni un ticket sin producto, y los detalles del ticket su nombre lo dice, lo detalla.

    Asi que te sugiero el :

    SELECT tabla1.campo, tabla2.campo, tabla3.campo, tabla4.campo FROM tabla1,tabla2,tabla3,tabla4 WHERE tabla.id=tabla2.idtabla1 and tabla2.id=tabla3.idtabla2

    Donde en el where pones las condiciones que pondrias en el left join.

    Esto por que?
    Por que el left join, hace busquedas y comparaciones despues de buscar en la primera (la de la izquierda) y en la que propongo, son indexaciones directas... y el flujo es mas rapido.


    Saludos, espero te ayude terricola.

    Stryfe™
      Votes: 1 - Link answer
     
  • Date: 20-09-2019 01:18:08 Al final hice lo siguiente
    Tengo un ticket asociado al cliente 8 con 3 productos de detalle y un pago:

    SELECT * FROM ticket,detalleticket,producto,pago,movimiento,tipomov where ticket.idc=8 AND detalleticket.idticket=ticket.idticket and producto.idproducto=detalleticket.idproducto and pago.idcliente=ticket.idc and movimiento.idcliente=ticket.idc and movimiento.tipomov=tipomov.idtipomov;


    Me devuelve bien 3 registros de los tres productos de ese ticket, pero en el mismo registro devuelve 3 veces el pago que es uno solo. Para mostrarlos datos en la tabla tendria que aparecer en un registro distinto.

    Debo usar distinct?
      Votes: 0 - Link answer
     
To actively participate in the community first must authenticate, enter the system.Sign In
 
frjcbbae garagebible.com