Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General » Mysql »

Lista ordenada bajo dos criterios, tres tablas involucradas

Estas en el tema de Lista ordenada bajo dos criterios, tres tablas involucradas en el foro de Mysql en Foros del Web. Hola a todos. Ando nuevamente por estos lados solicitando ayuda y agradezco de antemano su buena disposición. Mi consulta comienza con que tengo la tabla ...
  #1 (permalink)  
Antiguo 12/05/2013, 10:59
 
Fecha de Ingreso: enero-2013
Mensajes: 16
Antigüedad: 11 años, 11 meses
Puntos: 0
Lista ordenada bajo dos criterios, tres tablas involucradas

Hola a todos.

Ando nuevamente por estos lados solicitando ayuda y agradezco de antemano su buena disposición.
Mi consulta comienza con que tengo la tabla "tblTrabajos" con la siguientes estructura:

idTrabajo int(11) NOT NULL auto_increment,
idTrabajador int(11) NOT NULL,
idUsuario int(11) NOT NULL,
dateFecha_trabajo timestamp NOT NULL,

Necesito obtener la "tblTrabajos" ordenada de manera DESC por cantidad de evaluaciones, y a continuación por cantidad de votos, es decir a igual cantidad de evaluaciones mandan los votos. Si no tiene evaluaciones se ordena por la cantidad de votos. Si las evaluaciones y votos son iguales manda la fecha de inserción del registro (dateFecha_trabajo). Las otras dos tablas tienen la sgte. estructura:

"tblEval_trabajos":

idEval int(11) NOT NULL auto_increment,
idTrabajo int(11) NOT NULL,
idUsuario_eval int(11) NOT NULL,
intEval int(1) NOT NULL,
dateFecha_voto timestamp NOT NULL,

"tblVotos_trabajos":

idVoto int(11) NOT NULL auto_increment,
idTrabajo int(11) NOT NULL,
idUsuario_voto int(11) NOT NULL,
intVoto int(1) NOT NULL,
dateFecha_voto timestamp NOT NULL,

Las otras condiciones importantes son:
1.- Que sea para el "idTrabajador" que quiera. (WHERE idTrabajador= 'x').

2.- Considerando(sumando) la última evaluación y voto realizados por cada "idUsuario_eval" y "idUsuario_voto" , ya que estos pueden actualizar su voto cuantas veces quiera y estos quedan registrados en la misma tabla (sirve para conocer su comportamiento).

Acudo a ustedes porque sé que aquí puedo obtener la solución más eficiente. Por mi lado me ha quedado tan grande que ni siquiera una solución ineficiente me funciona, me refiero usando varios subconsultas anidadas.

Espero que se entienda y perdón por no usar código, si para alguien es mejor.

Gracias de antemano por su tiempo y ayuda.

Quedo atento a sus consultas y/o respuestas.

Saludos.
  #2 (permalink)  
Antiguo 12/05/2013, 14:21
Avatar de mortiprogramador
Colaborador
 
Fecha de Ingreso: septiembre-2009
Ubicación: mortuoria
Mensajes: 3.805
Antigüedad: 15 años, 3 meses
Puntos: 214
Respuesta: Lista ordenada bajo dos criterios, tres tablas involucradas


<saludos>
Uhm, bueno, me parece que pudiste explicar un poco mejor lo que
quisiste decir, pero hasta donde entendí el asunto,
yo usaría este query

Código MySQL:
Ver original
  1. (SELECT sum(intEval) FROM tbleval_trabajos  
  2. WHERE idtrabajo = t.idtrabajo AND idEval IN (SELECT MAX(idEval) FROM tbleval_trabajos
  3. GROUP BY idtrabajo, idUsuario_eval
  4. )
  5. GROUP BY idtrabajo)
  6. AS totalevaluaciones,
  7. (SELECT sum(intVoto) FROM tblvotos_trabajos  
  8. WHERE idtrabajo = t.idtrabajo AND idVoto IN (SELECT MAX(idVoto) FROM tblvotos_trabajos
  9. GROUP BY idtrabajo, idUsuario_voto
  10. )
  11. GROUP BY idtrabajo)
  12. AS totalvotos,
  13. IF (
  14. (SELECT sum(intEval) FROM tbleval_trabajos  
  15. WHERE idtrabajo = t.idtrabajo AND idEval IN (SELECT MAX(idEval) FROM tbleval_trabajos
  16. GROUP BY idtrabajo, idUsuario_eval
  17. )
  18. GROUP BY idtrabajo)=(SELECT sum(intVoto) FROM tblvotos_trabajos  
  19. WHERE idtrabajo = t.idtrabajo AND idVoto IN (SELECT MAX(idVoto) FROM tblvotos_trabajos
  20. GROUP BY idtrabajo, idUsuario_voto
  21. )
  22. GROUP BY idtrabajo),
  23. t.dateFecha_trabajo,
  24. '') as fecha
  25. FROM tbltrabajos t
  26. LEFT JOIN tbleval_trabajos e ON t.idtrabajo = e.idtrabajo
  27. LEFT JOIN tblvotos_trabajos v ON t.idtrabajo = v.idtrabajo
  28. WHERE t.idtrabajador = 1
  29. GROUP BY t.idtrabajo
  30. -- Puede ser también ORDER BY totalevaluaciones DESC, totalvotos DESC

</saludos>
__________________
"Si consigues ser algo más que un hombre, si te entregas a un ideal, si nadie puede detenerte, te conviertes en algo muy diferente."
Visita piggypon.com
  #3 (permalink)  
Antiguo 13/05/2013, 12:25
 
Fecha de Ingreso: enero-2013
Mensajes: 16
Antigüedad: 11 años, 11 meses
Puntos: 0
Respuesta: Lista ordenada bajo dos criterios, tres tablas involucradas

Primero que todo, muchas gracias por responder y de manera rápida.
Ahora caí que mi explicación no fue muy buena. Pero aún así lograste dar con la solución. Lo único que cuando la cant. de eval. y votos son iguales para distintos trabajos registrados, ordena estos colocando primero el más recientemente registrado y la idea es que aparezca primero el más antiguo. De echo no entiendo como funciona la parte de la agrupación por fecha, en especifico los comillas que utilizaste.

..........." GROUP BY idtrabajo), t.dateFecha_trabajo, ' ') as fecha "

De todas maneras agradezco enormemente tu ayuda y el esfuerzo por tratar de entenderme. Lo de la fecha es un detalle.

Considero solucionada mi solicitud de ayuda. La consulta no era nada de trivial!!!!!

Muchas gracias nuevamente "mortiprogramador".

malmonacid.
  #4 (permalink)  
Antiguo 13/05/2013, 19:00
Avatar de mortiprogramador
Colaborador
 
Fecha de Ingreso: septiembre-2009
Ubicación: mortuoria
Mensajes: 3.805
Antigüedad: 15 años, 3 meses
Puntos: 214
Respuesta: Lista ordenada bajo dos criterios, tres tablas involucradas

Pues genial que te haya funcionado.
En cuanto a lo que mencionas de la parte de la fecha, todo es parte del IF gigante que está en el query.
Que hace el if? Pues compara los valores de totalvotos vs totalevaluaciones, y si son iguales, trae el campo de la fecha evaluación, y si no lo son, deja el campo en blanco (Por eso las comillas sin nada dentro)
Y en cuanto agregar la fecha para que ordene, pues agrega la fecha en el order by, y con eso debería funcionar, espero te sirva
__________________
"Si consigues ser algo más que un hombre, si te entregas a un ideal, si nadie puede detenerte, te conviertes en algo muy diferente."
Visita piggypon.com

Etiquetas: criterios, lista, ordenada, registro, tabla, tablas, tres
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

SíEste tema le ha gustado a 1 personas




La zona horaria es GMT -6. Ahora son las 19:24.