Foros del Web » Programando para Internet » PHP »

Consultas con LEFT JOIN ON

Estas en el tema de Consultas con LEFT JOIN ON en el foro de PHP en Foros del Web. Hola a todos, mi problema es algo simple, pero complicado. Tengo que realizar un reporte de ventas con las siguientes tablas y campos. Tabla: asesores ...
  #1 (permalink)  
Antiguo 21/04/2005, 00:49
Avatar de ProgramadorMax  
Fecha de Ingreso: diciembre-2003
Ubicación: Ciudad de Mexico.
Mensajes: 47
Antigüedad: 20 años, 4 meses
Puntos: 0
Pregunta Consultas con LEFT JOIN ON

Hola a todos, mi problema es algo simple, pero complicado. Tengo que realizar un reporte de ventas con las siguientes tablas y campos.


Tabla: asesores : AsesorId,Nombre,ApellidoP,ApellidoM
Tabla: cliente : ClienteId, Nombre,ApellidoP,ApellidoM
Tabla: depto: DeptoId,Clave,Status,PrecioVenta,PrecioFinal
Tabla: grupo: GrupoId,Nombre

Este reporte debe mostrar el asesor y los nombres de los clientes a los cuales les ha vendido el departamento (Status- Vendido):



Dep Nombre Fecha Precio Venta Precio Final

Marcos Lopez Fierro

202 Martinez Nasar Rosa 24.Oct.2003 420,050.00 430,030.00

Carlos Almara Velasco
501 Pedro Perez Perez 24.Oct.2003 420,050.00 430,030.00
304 Gerardo Portales Cabaña 24.Oct.2003 420,050.00 430,030.00

Mi problema radica, en que no tengo mucha experiencia relacionando tablas y se me complica hacer un reporte de estas caracteristicas.

Mi codigo es el siguiente, haber si alguno me puede ayudar, por que la verdad no me llega la respuesta.

include ('connBienes.php');


Código PHP:
$resultado mysql_query("SELECT asesor.Nombres,asesor.ApellidoP,asesor.ApellidoM,cliente.Nombres,cliente.ApellidoP,cliente.ApellidoM,grupo.Nombre,depto.Clave,depto.Status
    FROM asesor,depto
    LEFT JOIN cliente ON asesor.AsesorId = cliente.AsesorId
    LEFT JOIN grupo ON depto.GrupoId = grupo.GrupoId
    WHERE depto.Status = 'Vendido'"
) or die(mysql_error()); 


echo 
"<table align=center border=2>";
while (
$fila mysql_fetch_assoc($resultado)) {
    echo 
"<tr>";
    foreach(
$fila as $clave) {
        echo 
"<td>"$clave"</td>";
    } 

echo 
"</table>"
Como se observa mi ignorancia se basa en los LEFT JOIN ON, asi como para imprimir los campos que deseo de esta forma como si fuera array .

Código PHP:
echo $fila ['asesor.Nombres'].$fila ['asesor.ApellidoP'].$fila ['asesor.ApellidoM']; 
Si utiliso el conocido AS, se me complica la cosa, para estar asignando a cada campo su nombre e imprimirlo en pantalla .

Código PHP:
$resultado mysql_query("SELECT asesor.Nombres AS AsesorN,asesor.ApellidoP AS AsesorP,asesor.ApellidoMAS AsesorM,cliente.Nombres AS ClienteN,cliente.ApellidoP AS ClienteP,cliente.ApellidoM AS ClienteM,grupo.Nombre,depto.Clave,depto.Status
    FROM asesor,depto
    LEFT JOIN cliente ON asesor.AsesorId = cliente.AsesorId
    LEFT JOIN grupo ON depto.GrupoId = grupo.GrupoId
    WHERE depto.Status = 'Vendido'"
) or die(mysql_error()); 

echo 
$fila ['AsesorN'].$fila ['AsesorP'].$fila ['AsesorM']; 
Y para terminar, tampoco me doy idea de como generar esto :

Asesor
Cliente
Cliente
Cliente
Asesor
cliente
Asesor
cliente
cliente

El conocido while no me salva, por que no me doy idea .

Código PHP:
while () {
asesor   
while () {
cliente   




En fin, agradeceria mucho pudieran orientarme, por que soy de los que aprenden autodidacticamente, pero cuando no hay trucos bajo la manga y no se tiene experiencia, pues solo queda la frustracion.

Gracias por adelantado.
__________________
Tonto es aquel que tiene el conocimiento y no sabe como usarlo...
Solo destripando creo mostruos de soluciones.
  #2 (permalink)  
Antiguo 21/04/2005, 08:59
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 22 años, 3 meses
Puntos: 129
Para el primer problema .. usa mysql_fetch_array() .. Si no tienes nombres duplicados de campos en las tablas que intervengan y que te pueda dar conflictos por el valor que deseas ver (uno u otro si no son iguales ..) entonces tendrás que usar "AS" (crear alias) si o si ...

Usando más SQL podrías "concatenar" directamente desde tu consulta SQL ese "nombre" y "apellido" (http://dev.mysql.com/doc/mysql/en/string-functions.html)

------------------------------------------------------------------

El otro problema que tienes tal vez es que obtienes un resultado tipo
Asesor1 Cliente
Asesor1 Cliente
AsesorX Cliente
AsesorX Cliente

(o mezclado ...)

Pero quieres "Agrupar" y presentarlo de la manera que deseas ..

En ese caso, lo que se suele hacer es:
1) se ordena por el campo que "agrupe" .. en tu caso "asesor" con un ORDER BY nombre_del_campo a ordenar
2) Haces un "if()" condicional para decidir si "ha cambiado el campo que agrupa" para mostrarlo .. o no mostrarlo. Para eso necesitaras una variable "acomulador" o similar para tal fin.

Sería algo tipo: (asumo que usaras "AS" alias .. para evitar problemas):
Código PHP:
$asesor='';
while (
$row=mysql_fetch_array($resultado)){
   if (
$row['AsesorN']!=$asesor){
      echo 
$row['AsesorN']."<br>";
   } else {
      
$asesor=$row['AsesorN']; 
   }

   echo 
$row['otroscampos ....']."<br>";


Si no me equivoqué .. algo así es el tema ... Es altamente importante que se ordene por el campo que se "agrupa" .. sino esta lógica no funcionará.

Un saludo,
  #3 (permalink)  
Antiguo 21/04/2005, 15:24
Avatar de ProgramadorMax  
Fecha de Ingreso: diciembre-2003
Ubicación: Ciudad de Mexico.
Mensajes: 47
Antigüedad: 20 años, 4 meses
Puntos: 0
Muchas Gracias

Gracias a tus instrucciones, pude encontrar esta magnifica funcion de MySQL y que resuelve el problema de estar colocando un alias a cada campo de la forma AS, aunque de todos modos es lo mismo, pero mas juntito :

Código PHP:
$campos = array(
      
"Asesor" => "CONCAT_WS(' ', asesor.Nombres, asesor.ApellidoP, asesor.ApellidoM)",
      
"Cliente" => "CONCAT_WS(' ', cliente.Nombres, cliente.ApellidoP, cliente.ApellidoM)",
      
"Status" => "depto.Status"
Simplemente es fantastico Cluster, ademas insertando esto al SELECT de la consulta con un foreach, soluciona mucho el problemita .

Código PHP:
$queryReporte "SELECT  ";
foreach (
$campos as $key => $value){
    
$queryReporte .= " ".$value." as '".$key."',";
}

$queryReporte substr($queryReporte0strlen($queryReporte)-1);
$queryReporte .= "

FROM asesor
JOIN cliente ON asesor.AsesorId = cliente.AsesorId
JOIN cotizacion ON cliente.ClienteId = cotizacion.ClienteId
JOIN depto ON depto.DeptoId = cotizacion.DeptoId
JOIN grupo ON depto.GrupoId = grupo.GrupoId
JOIN compra on cotizacion.CotizacionId = compra.CotizacionId
WHERE depto.Status = 'Vendido'  ORDER BY asesor.AsesorId, cliente.ClienteId"
;

$Reporte mysql_query($queryReporte);
$rowReporte mysql_fetch_assoc($Reporte);
$numrowsReporte mysql_num_rows($Reporte); 
La otra cuestion de ordenarle a cada asesor sus clientes con ORDER BY me ayudo mucho.

Tambien utilize tu estructura, pero con foreach .

Gracias Cluster, me orientaste en la direccion correcta.
__________________
Tonto es aquel que tiene el conocimiento y no sabe como usarlo...
Solo destripando creo mostruos de soluciones.
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 11:01.