MySQL - Consulta en MySql para obtener Cuadro de Honor

   
Vista:
Imágen de perfil de Jaime Ariel

Consulta en MySql para obtener Cuadro de Honor

Publicado por Jaime Ariel (4 intervenciones) el 15/05/2015 05:52:14
Muy Buenas Noches..

Les envió un saludo muy cordial, a modo de realizar mi consulta, quiero aprovechar la información que tengo en una tabla sobre unas notas de diferentes materias llevadas en un colegio y sus promedios, para obtener el cuadro de honor que consiste en, sacar las 1ª y 2ª notas más altas de cada curso, le di todas las vueltas posibles según mis conocimientos y no logro obtener los resultados necesarios, más allá de este primer inconveniente surge otro que es, en algunos cursos pueden existir dos e incluso tres estudiantes que tengas la 1ª nota más alta y/o la 2ª mejor, los cuales tiene también que salir en la lista a obtener.

Sin dudar de su apoyo me despido reiterando mis saludos y agradeciendo por sus soportes.

Atte. : Jaime Mariscal
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

Consulta en MySql para obtener Cuadro de Honor

Publicado por leonardo_josue (81 intervenciones) el 15/05/2015 17:32:54
Hola Jaime Ariel:

No nos dices cómo es la estructura de tu tabla ni nos pones algunos datos de ejemplo, por lo tanto, resulta un tanto complicado darte una respuesta puntual. Sin embargo, creo entender tu problema. Tienes muchas formas de obtener el resultado que necesitas, algunas más complicadas que otras, pero en general todo se resume ordenar los registros para saber cuál está en primero y en segundo lugar... puedes darle un vistazo a estas ligas:

http://www.artfulsoftware.com/infotree/qrytip.php?id=1098

http://dba.stackexchange.com/questions/13703/get-the-rank-of-a-user-in-a-score-table

Aquí la idea es agregar una columna que te dé el ranking o la posición del registro de acuerdo a una calificación. También puedes preguntarle a SAN GOOGLE ¿cómo simular la función rank en mysql? estoy seguro que obtendrás muchas respuestas.

Saludos
Leo
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Jaime Ariel

Consulta en MySql para obtener Cuadro de Honor

Publicado por Jaime Ariel (4 intervenciones) el 18/05/2015 08:33:24
Tengo una vista similar a esta ordenada por cursos y promedios: el nombre de mi vista es evaluaciones

Sin-titulo

y requiero obtener una tabla como la siguiente:

Resultado

podria ser obtenidos en 1 o dos consultas

haciendo un poco de uso de la informacion obtendida logre llegar a esto:

Les aviso que ya consegui realizar la primera parte.. La obtencion de las 1ras mejores notas, lo que aun no puedo sacar son las 2das mejores, si me pudieran ayudar les estare muy agradecido, por si alguien requiera la misma informacion comparto la primera solucion que obtuve para obtener los 1ras mejores notas.

Por cierto estoy trabajando sobre una vista que contiene los nombres completos de los estudantes, un id estudiante, su curso y los promedios correspondientes, de lo cual solo requiero el nombre, el curso y la nota, para lo cual utilizo lo siguiente:

SELECT a.Curso, a.NombreElestudiante, a.Promedio, b.Promedio


FROM evaluaciones a, ( SELECT max( promedio ) AS promedio
FROM evaluaciones
GROUP BY curso ) b


WHERE (a.Promedio = b.Promedio)
GROUP BY a.Curso

Asi de simple, espero me puedan ayudar con los faltantes 2dos lugares, gracias de antemano.

Por mi parte tambien seguire insistiendo y si lo consigo lo publicare.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Consulta en MySql para obtener Cuadro de Honor

Publicado por leonardo_josue (81 intervenciones) el 18/05/2015 17:38:42
Hola de nuevo Jaime Ariel:

¿Te tomaste el tiempo al menos para leer el contenido de las ligas que te puse?... sinceramente me haces dudar que lo hayas hecho, porque en ambas ligas se encuentra la respuesta para el problema que planteas ¬¬. Lo menos que podemos esperar es que los foristas intenten resolver las consultas con las ayudas que se les proporcionamos, y si continuan con problemas, que indicen qué es lo que no pudieron hacer o por qué... observa este ejemplo:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
mysql> SELECT * FROM tabla;
+------+-------+----------+------------------+
| id   | curso | Promedio | NombreEstudiante |
+------+-------+----------+------------------+
|    1 | 1A    |    99.45 | Carlos Escolante |
|    2 | 1A    |    98.25 | Jose Fernandez   |
|    3 | 1A    |    97.36 | Gualdo Montes    |
|    4 | 1A    |    96.48 | Perico Valoz     |
|    5 | 1B    |    97.88 | Lourdes Cortes   |
|    6 | 1B    |    95.54 | Hugo Sanchez     |
|    7 | 1B    |    99.85 | Miriam Ferrer    |
|    8 | 1B    |    96.55 | Federico Lopez   |
|    9 | 1C    |    94.91 | Hector Moreno    |
|   10 | 1C    |    97.21 | Javier Hernandez |
|   11 | 1C    |    97.21 | Rafael Marquez   |
|   12 | 1C    |    94.91 | Carlos Vela      |
+------+-------+----------+------------------+
12 rows in set (0.00 sec)
 
mysql> SELECT
    ->    T1.id,
    ->    T1.curso,
    ->    T1.nombreEstudiante,
    ->    promedio,
    ->    FIND_IN_SET(promedio, (SELECT GROUP_CONCAT(DISTINCT T2.promedio ORDER BY T2.promedio DESC)
    ->                           FROM tabla T2
    ->                           WHERE T2.curso = T1.curso)) rank
    -> FROM tabla T1
    -> ORDER BY curso, rank;
+------+-------+------------------+----------+------+
| id   | curso | nombreEstudiante | promedio | rank |
+------+-------+------------------+----------+------+
|    1 | 1A    | Carlos Escolante |    99.45 |    1 |
|    2 | 1A    | Jose Fernandez   |    98.25 |    2 |
|    3 | 1A    | Gualdo Montes    |    97.36 |    3 |
|    4 | 1A    | Perico Valoz     |    96.48 |    4 |
|    7 | 1B    | Miriam Ferrer    |    99.85 |    1 |
|    5 | 1B    | Lourdes Cortes   |    97.88 |    2 |
|    8 | 1B    | Federico Lopez   |    96.55 |    3 |
|    6 | 1B    | Hugo Sanchez     |    95.54 |    4 |
|   10 | 1C    | Javier Hernandez |    97.21 |    1 |
|   11 | 1C    | Rafael Marquez   |    97.21 |    1 |
|   12 | 1C    | Carlos Vela      |    94.91 |    2 |
|    9 | 1C    | Hector Moreno    |    94.91 |    2 |
+------+-------+------------------+----------+------+
12 rows in set (0.00 sec)

Esta consulta es básicamente la misma que aparece en la segunda liga, sólo agregando una cláusula DISTINCT y un filtro WHERE en la subconsulta del FIND_IN_SET...


1
2
3
4
5
6
SELECT id, name, score, FIND_IN_SET( score, (
SELECT GROUP_CONCAT( score
ORDER BY score DESC )
FROM scores )
) AS rank
FROM scores


Aquí se resuelve el problema no solo de qué posición ocupa el alumno de acuerdo a su promedio, sino también los casos en donde puede haber empates en primero o segundo lugar, cómo en el caso del CURSO = 1C... Si sólo quieres mostrar primero y segundo, lo único que tienes que hacer es un WHERE que filtre el campo rank y listo.

Entonces, ¿dónde estuvo el problema?

Dale un vistazo, o mejor dicho, no vistazo, sino REVISA A CONCIENCIA las ligas que que te puse... trata de resolver esta misma consulta con la otra forma (primer liga) que es utilizando variables y contadores... te servirá para que tengas un panorama más amplio del tipo de consulta que puedes realizar en MySQL si le dedicas un poco de tiempo

Saludos.
Leo.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Jaime Ariel

Consulta en MySql para obtener Cuadro de Honor

Publicado por Jaime Ariel (4 intervenciones) el 19/05/2015 07:03:44
Claro que las consulte y saque la misma lista que pusiste de ejemplo, lo de malo es que saca el ranking de mis 2500 estudiantes ordenados del primero al ultimo eso si.. modifique algunas condiciones y obtuve algunos resultados inesperados jaja como por ejemplo la condicion de que no sean iguales sino diferentes para intentar lograr una lista de 1, 2 por cada curso pero lo unico que logre fue que todo salga 1 y 2 probablemente porque no comprendi el funcionamiento del condicionante IF y no encontrar una razon para que solo salgan las numeraciones 1 y 2 en el ranking que obtengo por cada curso.

Por lo mismo logre obtener solo los primeros lugares de manera eficiente, lo unico es que no encuentro la logica para preguntar los segundos, bueno no comprendo donde preguntar la condicion de que sea menor al maximo y que no me salgan todos los menores incluido el mas bajo de todos, suena gracioso.

Bueno seguire probando una y otra opcion hasta obtener y la publicare para alguno que requiera en algun otro momento, gracias por su tiempo... Y Saludos...
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Jaime Ariel

Consulta en MySql para obtener Cuadro de Honor

Publicado por Jaime Ariel (4 intervenciones) el 19/05/2015 07:42:42
Bueno Ahora si lo tengo... eso del distinct era lo que le faltaba a mi consulta.. jajaja bueno quedo muy agradecido por el apoyo y por su tiempo

Saludos y hasta una proxima oportunidad
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Consulta en MySql para obtener Cuadro de Honor

Publicado por Leopoldo Taylhardat (43 intervenciones) el 15/05/2015 21:26:11
Saludos...

Puede ser algo así...

Select * from estudiante_materia where (nota in (select top 2 nota from estudiante_materia where ... order by nota desc )) where ... order by nota desc ;

espero que te sirva...
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Consulta en MySql para obtener Cuadro de Honor

Publicado por leonardo_josue (81 intervenciones) el 15/05/2015 22:28:48
Hola Leopoldo:

Mucho ojo, este es un foro de MySQL, el operador TOP no existe como tal en esta base de datos, sino que es propia de SQL Server y algunas otras, aunque la idea también puede aplicarse. Si deseas utilizar esta lógica, puedes utilizar la función LIMIT, que sería el equivalente al TOP.

Hay muchas formas de resolver esta consulta, todo depende de cómo tienes organizada tu información.

Saludos
Leo.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Consulta en MySql para obtener Cuadro de Honor

Publicado por Leopoldo Taylhardat (43 intervenciones) el 16/05/2015 16:20:17
Saludos...
mis disculpas por el operador TOP... pero por eso puse "Puede ser algo así..." ya que no soy muy experto en Mysql pero sí en otras bases de datos...
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar