Reglamento general de los foros   •   FAQ   •   Buscar en el foro •  Registrarse | Iniciar sesión 



Foros Linux » Desarrollo » Programación


Nuevo tema Responder al tema
 [ 8 mensajes ] 
Patrocinadores

Autor
Buscar:
Mensaje

Desconectado
Forista Medio
Forista Medio
Avatar de Usuario

Registrado: Mar Feb 27, 2007 12:00 am
Mensajes: 279
Ubicación: PANAMA

Nota Publicado: Vie Oct 15, 2010 10:59 pm 
Arriba  
Hola que tal,

Tengo otro reto, bueno no se si para ustedes jajaja pero para mi (que tengo menos de 2 meses aprendiendo php y mysql) es uno...

a ver si lo resolvemos juntos... :)

ok, tengo la siguiente duda, se me ha pedido que de una base de datos jale unos campos, el punto es que hay muchos usuarios en la base de datos y cada usuario forma parte de un grupo (hay 3 grupos), JUNIOR, SENIOR y SOCIO en tonces cada usuario tiene en su haber una cierta cantidad de horas tabajadas y debo mostrar la sumatoria de esas horas pero no por cada usuario, sino por grupo al que pertenecen, ejemplo:

carlos = 5
maria = 1
ana = 5

carlos y ana pertenecen al grupo SOCIO y maria pertenece al grupo JUNIOR, entonces en la pagina debe aparecer de esta forma:

SOCIO: 10
JUNIOR: 1

de esta forma debe aparcer y es la correcta segun lo que tengo que hacer.

ahora bien, yo asocie los usuarios y los grupos de esta forma en MYSQL:

concat(usr.grupo,' ',usr.name) as a_usuarios de esta forma ya se que usuario pertenece a que grupo y puedo dividirlos en php de esta forma:

Código:
while($row = mysql_fetch_array($resultado)){

$hora = $row['actual'];
$a_usuarios = $row['a_usuarios'];
$pos1 = strpos($a_usuarios,'socio');
$pos2 = strpos($a_usuarios,'senior');
$pos3 = strpos($a_usuarios,'junior');

if(is_bool($pos1) === false){
          echo 'Total Horas de Actuacion Profesional Socio: '.$hora;
}
if(is_bool($pos2) === false){
          echo 'Total Horas de Actuacion Profesional Junior: '.$hora;
}
if(is_bool($pos3) === false){
          echo 'Total Horas de Actuacion Profesional Senior: '.$hora;
}

}//fin del bucle


el problema aqui es que me imprime todos los usuarios cada uno con sus horas.

del ejemplo anterior y con este codigo, me sale lo siguiente:

Total Horas de Actuacion Profesional Socio: 5
Total Horas de Actuacion Profesional Socio: 5
Total Horas de Actuacion Profesional Junior: 1

y lo que se quiere es que salga:

Total Horas de Actuacion Profesional Socio: 10
Total Horas de Actuacion Profesional Junior: 1


se entiende ?

Ahora bien, lo que se quiere, se hace por medio de PHP o se hace directo en MySQL ?
se que esto que hice no es lo mejor, pero estoy aprendiendo y trato de mejorar :) para ver si alguien me guia y me dice como lo puedo hacer ?

Saludos.

_________________
http://greer.nodolinux.com


Última edición por greer el Sab Oct 16, 2010 3:37 pm, editado 1 vez en total
 Perfil WWW  

Desconectado
Moderador
Moderador
Avatar de Usuario

Registrado: Dom Abr 18, 2010 4:30 pm
Mensajes: 2790
Ubicación: En una de las nalgas del culo del mundo (según la Bersuit Vergarabat)

Nota Publicado: Sab Oct 16, 2010 9:45 am 
Arriba  
me gustaría ver la estructura de tu tabla ... y la consulta ya que php lo que hace es organizar los datos pero lo que lee los datos es SQL
suponiendo que tienes todo en una tabla llamada datos con los sigiuentes campos

id - usuario - grupo - horas -

la consulta seria

Código:
SELECT * FROM datos GROUP BY grupo




pero como te dije antes sin saber como son tus tablas y sin conocer la consulta que haces es dificil ayudarte

_________________
... reinstalar un SO cuando produce un error es como tirar un bebe a la basura cuando se hace caca..

Trusted Network and Developer | Reglamento General de los Foros |WIKI-EL | Twitter @SISIAM
Debian| ArchLinux |Linux User #508809

 Perfil WWW  

Desconectado
Forista Medio
Forista Medio
Avatar de Usuario

Registrado: Mar Feb 27, 2007 12:00 am
Mensajes: 279
Ubicación: PANAMA

Nota Publicado: Sab Oct 16, 2010 10:01 am 
Arriba  
ho! jajaj si si se me olvidaba....

mira esto es lo que tengo:


Código:
$consulta = "
      SELECT
         concat(usr.title,' ',usr.first_name,' ',usr.last_name) a_usuarios,
         t.actual as actual,
         ilc.moneda_c as moneda,
         ilc.valor_hora_junior_c as junior,
         ilc.valor_hora_senior_c as senior,
         ilc.valor_hora_socio_c as socio
      FROM
         timesheet t,
         infor_liquies_timesheet_c iltc,
         users usr,
         infor_liquidaciones_cstm ilc,
         infor_liquidaciones il
      WHERE
         il.id = ilc.id_c
         AND t.assigned_user_id = usr.id
         AND iltc.infor_liqu3bdfaciones_ida = il.id
         AND iltc.infor_liqub154mesheet_idb = t.id
         AND iltc.deleted = 0
         AND t.deleted = 0
         AND usr.deleted = 0
         AND il.id = '$id'";

_________________
http://greer.nodolinux.com

 Perfil WWW  

Desconectado
Moderador
Moderador
Avatar de Usuario

Registrado: Dom Abr 18, 2010 4:30 pm
Mensajes: 2790
Ubicación: En una de las nalgas del culo del mundo (según la Bersuit Vergarabat)

Nota Publicado: Sab Oct 16, 2010 10:13 am 
Arriba  
bueno sigues sin poner las tablas osea que tenemos que seguir imaginándolas :evil: :evil:

pero por lo que veo en tu consulta, en el WHERE jamas llamas al campo que te interesa que es el gupo SENIOR JUNIOR o SOCIO veo que llamas a AND il.id = '$id'"; lo que lógicamente te devuelve el identificador de usuario ( supongo ya que no conozco tus tablas )

revisa eso

_________________
... reinstalar un SO cuando produce un error es como tirar un bebe a la basura cuando se hace caca..

Trusted Network and Developer | Reglamento General de los Foros |WIKI-EL | Twitter @SISIAM
Debian| ArchLinux |Linux User #508809

 Perfil WWW  

Desconectado
Forista Medio
Forista Medio
Avatar de Usuario

Registrado: Mar Feb 27, 2007 12:00 am
Mensajes: 279
Ubicación: PANAMA

Nota Publicado: Sab Oct 16, 2010 2:34 pm 
Arriba  
en la tabla: users usr esta el campo: usr.title que es el que uso para definir que usuario es de que grupo. El nombre del usuario y los demas datos del usuario estan dentro de esta tabla.

en el WHERE ese id que mencionas, es el identificador del formulario y no del usuario ya que desde los formulario es que llamo a la tablas donde se guardan las horas de los usuarios y esta tabla de usuarios tiene un campo que relaciona al cliente.

en fin te explico como estan las cosas: hay tres tablas importantes:

1- infor_liquidaciones il : que es de donde se muestra la informacion que quiero y necesito...

2- timesheet t : que es la que guarda las horas de cada usuario: ejemplo: si maria tiene 3 horas, esas 3 horas se guardan en esta tabla.

3- users usr : que es la que tiene a los usuarios y sus datos personales, dentro de esta tabla hay un campo llamado: title que es donde defino si el usuario es de un grupo o de otro (JUNIOR, SENIOR ó SOCIO).

Ahora bien las otras tablas que se ven en mi consulta son las que relacionan una tabla con la otra, veamos como:

1- infor_liquies_timesheet_c iltc : es la tabla que en su haber tiene 2 campos importantes, uno que guarda el id o identificador de la tabla: infor_liquidaciones il y el otro campo es el que guarda el id o identificador de la tabla: timesheet t donde se guardan las horas.

como veras en mi consulta es:

Citar:
AND iltc.infor_liqu3bdfaciones_ida = il.id
AND iltc.infor_liqub154mesheet_idb = t.id

2- Entonces el usuario se relaciona con la tabla: timesheet t esta tabla tiene, a parte de las horas de cada usuario un campo llamado: t.assigned_user_id que es el que guarda el id o identificador del usuario.

como veras en mi consulta es:

Código:
AND t.assigned_user_id = usr.id


osea que cuando entro al formulario este a su vez llama a la tabla dode se guardan las horas que a su vez llama al usuario.

Se entiende ? no te puedo mostrar las tablas ya que estan en un servidor remoto que solo permite conecciones locales, pero creo que esto aclara un poco mas.


Tambien intente usar GROUP BY quedando asi:

Código:
AND il.id = '$id' GROUP BY a_usuarios";


pero esto solo me arrojo algo asi:

Total Horas de Actuacion Profesional Socio: 5
Total Horas de Actuacion Profesional Junior: 1


segun mi ejemplo de mas arriba, me dejo afuera un registro.

carlos (Socio) = 5
maria (Junior) = 1
ana (Socio) = 5

y lo que quiero es que me arroje:

Total Horas de Actuacion Profesional Socio: 10
Total Horas de Actuacion Profesional Junior: 1


pero actualmente me arroja esto:

Total Horas de Actuacion Profesional Socio: 5
Total Horas de Actuacion Profesional Socio: 5
Total Horas de Actuacion Profesional Junior: 1

Saludos.

_________________
http://greer.nodolinux.com

 Perfil WWW  

Desconectado
Moderador
Moderador
Avatar de Usuario

Registrado: Mié Nov 28, 2007 12:00 am
Mensajes: 1361
Ubicación: En la X del explorer (pulse para llamar)

Nota Publicado: Sab Oct 16, 2010 2:39 pm 
Arriba  
Supongamos que tienes una consulta (porque tabla parece que no) cuyo resultado contiene como campos el grupo y las horas trabajadas. Típicamente, y entre otros campos, tendrás como salida algo como:
Código:
nombre | grupo | horas
------------------------------
carlos | socio | 5
ana | socio | 5
maria | junior | 1

Partiendo de esa consulta que tienes hecha, y con lo que ha dicho m[cun] en un primer momento del group by, tan sólo tendrías que hacer lo siguiente:
Código:
select grupo, sum(horas) from (
  <consulta>
) group by grupo;

donde <consulta> es la consulta que da los resultados mostrados antes.

Para que quede un poco más claro:
Código:
SELECT grupo, sum(horas) FROM (
  SELECT * FROM tabla_usuario, tabla_horas WHERE id_usuario = id
) GROUP BY grupo;


No sé si te servirá en cuanto a rendimiento (no tengo claro si realmente puede perjudicar el rendimiento), pero puedes probarlo.

_________________
Descargue el gestor de mp3 "Music Manager" -> (mmlf)
Última versión del gestor "Music Manager" -> (jmmm)

 Perfil  

Desconectado
Forista Medio
Forista Medio
Avatar de Usuario

Registrado: Mar Feb 27, 2007 12:00 am
Mensajes: 279
Ubicación: PANAMA

Nota Publicado: Sab Oct 16, 2010 3:32 pm 
Arriba  
mmmm bueno eso lo probe antes, por medio de MYSQL y por PHP usando el bucle while:

Citar:
$horas = 0;
while($row = mysql_fetch_assoc($resultado)){
$horas = $horas + $row['actual'];
}


usando la funcion sum() en MySQL y por medio de un bucle en PHP me arroja el mismo resultado.

y que resultado me tira ?

jjajajaja jaja akodo tu eres lo maximo pana! jajajaja si me salio, hice lo mismo anteriormente sumando desde MySQL directamente y por PHP tambien pero nunca s eme ocurrio agruparlos usando GROUP BY bueno si use GROUP BY pero cuando lo use no puse la funcion sum().

asi quedo:


Citar:
$consulta = "
SELECT
concat(usr.title,' ',usr.first_name,' ',usr.last_name) a_usuarios,
usr.title,
sum(t.actual) as actual,
ilc.moneda_c as moneda,
ilc.valor_hora_junior_c as junior,
ilc.valor_hora_senior_c as senior,
ilc.valor_hora_socio_c as socio
FROM
timesheet t,
infor_liquies_timesheet_c iltc,
users usr,
infor_liquidaciones_cstm ilc,
infor_liquidaciones il
WHERE
il.id = ilc.id_c
AND t.assigned_user_id = usr.id
AND iltc.infor_liqu3bdfaciones_ida = il.id
AND iltc.infor_liqub154mesheet_idb = t.id
AND iltc.deleted = 0
AND t.deleted = 0
AND usr.deleted = 0
AND il.id = '$id' group by usr.title";


y asi si me salio bien jajaja, que tonteria yo buscandole la 5 pata al gato y todo estaba alli mismo jaja gracias akodo y a m[cun]

Saludos.

_________________
http://greer.nodolinux.com

 Perfil WWW  

Desconectado
Moderador
Moderador
Avatar de Usuario

Registrado: Dom Abr 18, 2010 4:30 pm
Mensajes: 2790
Ubicación: En una de las nalgas del culo del mundo (según la Bersuit Vergarabat)

Nota Publicado: Sab Oct 16, 2010 3:46 pm 
Arriba  
bien que bueno que ayas dado con la solución ... comentario al margen ( creo que ya te lo he dicho en otro post) me parece que deberías revisar como armas las tablas a mi juicio el mejor criterio es crear una tabla distinta para cada objeto diferente de la vida real, en tu caso seria crear tres tablas SENIOR JUNIOR SOCIOS luego la consulta es super simple, ten presente que al momento de comenzar con un sistema uno tiene en mente lo que se precisa de forma inmediata y tal vez lo que se precisara a mediano plazo.... pero en ocasiones las cosas van hasta lugares insospechados. por ello cuanto mas distribuidos los datos mejor.

saludos

_________________
... reinstalar un SO cuando produce un error es como tirar un bebe a la basura cuando se hace caca..

Trusted Network and Developer | Reglamento General de los Foros |WIKI-EL | Twitter @SISIAM
Debian| ArchLinux |Linux User #508809

 Perfil WWW  
Mostrar mensajes previos:  Ordenar por  
 [ 8 mensajes ] 
Nuevo tema Responder al tema

Saltar a:  


¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 2 invitados

No puede abrir nuevos temas en este Foro
No puede responder a temas en este Foro
No puede editar sus mensajes en este Foro
No puede borrar sus mensajes en este Foro
No puede enviar adjuntos en este Foro

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group :: Style based on FI Subice by phpBBservice.nl :: Todos los horarios son UTC - 6 horas
Traducción al español por Huan Manwë
phpBB SEO