SQL - Consulta sql los 5 mas registrados

 
Vista:
sin imagen de perfil

Consulta sql los 5 mas registrados

Publicado por Rafael (3 intervenciones) el 13/07/2015 02:01:03
Hola estimados:
espero que puedan ayudareme tengo un pequeño problema con una consulta sql, tengo un sistema web de reserva de laboratorios donde los docentes pueden reservar los diferentes laboratorios del establecimiento por medio de este sistema web. luego de la reserva les toca ejecutar la clase. tengo una tabla que se llama registro donde tengo campos foraneos:

Registro:
-idreg
-hora
-fecha
-aula (fk)
-usuario (fk)
-curso (fk)
-asignatura (fk)
-asistencia
-actividad
-objetivo
-observacion
-estado

estoy graficando los datos de esta tabla mysql utilizando el framwork highchart, tengo una consulta sql donde se grafican todos los cursos que mas se han registrado, la consulta es la siguiente:



"SELECT registro.curso, curso.curso FROM registro, curso WHERE registro.curso = curso.idcur AND registro.estado = 'Realizada' GROUP BY curso.curso desc ";

['<?php echo $res['curso'] ?>'], // esto es el eje Y

esta consulta me devuelve los nombres de los cursos ya que como es foranea tengo que interactuar con la tabla curso para poder mostrar el nombre de cada curso.


la sieguiente consulta sql es:

"SELECT COUNT(*) AS Total, curso.curso FROM registro, curso WHERE registro.estado = 'Realizada' AND registro.curso = curso.idcur GROUP BY registro.curso desc;

esta consulta me cuenta la cantidad de registros de cada curso en la base de datos. esto es el eje X

a continuacion la grafia de las consultas:

grafico_cursos


bien, entonces quisiera saber si me pueden ayudar , ya que solo quiero mostrar a los 5 cursos que mas han ido al los laboratorios. osea los cursos que mas se han registrado en las diferentes aulas. espero haber sido claro para que puedan entender mi duda. he probado con las sentencias top, max pero no he conseguido el resultado que espero, quizás no he podido estructurar bien la consulta.

desde ya les agradezco su tiempo y su buena disposición..
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
sin imagen de perfil
Val: 806
Bronce
Ha mantenido su posición en SQL (en relación al último mes)
Gráfica de SQL

Consulta sql los 5 mas registrados

Publicado por leonardo_josue (1173 intervenciones) el 13/07/2015 16:17:24
Hola Rafael:

En MySQL, utilizas el operador LIMIT en conjunto con la clásula ORDER BY para regresar sólo el número de registros que te interesa, por ejemplo, supongamos que tenemos esta tabla:

1
2
3
4
5
6
7
8
9
10
11
12
mysql> SELECT * FROM tabla1;
+------+-------------+
| id_1 | descripcion |
+------+-------------+
|    1 | uno         |
|    2 | dos         |
|    3 | tres        |
|    4 | cuatro      |
|    5 | cinco       |
|    6 | seis        |
+------+-------------+
6 rows in set (0.00 sec)

Si quisiéramos obtener los últimos 3 id's, entonces ordenamos de manera desc por ese campo y hacemos un LIMIT 3, así:

1
2
3
4
5
6
7
8
9
mysql> SELECT * FROM tabla1 ORDER BY id_1 desc LIMIT 3;
+------+-------------+
| id_1 | descripcion |
+------+-------------+
|    6 | seis        |
|    5 | cinco       |
|    4 | cuatro      |
+------+-------------+
3 rows in set (0.00 sec)

Haz la prueba y nos comentas.

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
sin imagen de perfil

Consulta sql los 5 mas registrados

Publicado por Rafael (3 intervenciones) el 13/07/2015 16:43:36
Hola Leonardo
antes que todo gracias por responder, efectivamente en mysql se utiliza el operador LIMIT he probado la consulta que me has dicho y muestra solo 3 registro pero no me muestra los mas registrados

esta es la consulta que tengo

SELECT COUNT(*) AS Total, curso.curso FROM registro, curso WHERE registro.estado = 'Realizada' AND registro.curso = curso.idcur GROUP BY registro.curso desc LIMIT 3;

[<?php echo $res['Total'] ?>],

grafico

gracias.
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
sin imagen de perfil
Val: 806
Bronce
Ha mantenido su posición en SQL (en relación al último mes)
Gráfica de SQL

Consulta sql los 5 mas registrados

Publicado por leonardo_josue (1173 intervenciones) el 13/07/2015 19:15:47
Hola de nuevo Rafael:

Mucho ojo, hay que leer cuidadosamente las respuestas que se dan en el post, pues estás omitiendo una parte vital en lo que te comenté... en mi post puse esto:

1
2
En MySQL, utilizas el operador LIMIT  en conjunto con la clásula ORDER BY para regresar
sólo el número de registros que te interesa

En tu consulta NO ESTÁS ORDENANDO LOS REGISTROS, sino simplemente de pusiste la palabra DESC al GROUP BY, por lo tanto, el operador LIMIT simplemente de toma los primeros que encuentra... checa este otro ejemplo: Supongamos que tenemos esta tabla:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
mysql> SELECT * FROM tabla1;
+------+-------------+
| id_1 | descripcion |
+------+-------------+
|    1 | uno         |
|    2 | dos         |
|    3 | dos         |
|    4 | dos         |
|    5 | tres        |
|    6 | tres        |
|    7 | cuatro      |
|    8 | cinco       |
+------+-------------+
8 rows in set (0.00 sec)

Si contamos cuántas veces se repiten las descripciones, tenemos el siguiente resultado:

1
2
3
4
5
6
7
8
9
10
11
12
13
mysql> SELECT descripcion, COUNT(descripcion) total
    -> FROM tabla1
    -> GROUP BY descripcion;
+-------------+-------+
| descripcion | total |
+-------------+-------+
| cinco       |     1 |
| cuatro      |     1 |
| dos         |     3 |
| tres        |     2 |
| uno         |     1 |
+-------------+-------+
5 rows in set (0.00 sec)

Ahora, si quisieras recuperar las dos descripciones que más elementos tienen tienes qué ORDENAR POR EL CAMPO TOTAL de manera descendente y entonces haces el LIMIT... tal como lo estás haciendo tienes esto:

1
2
3
4
5
6
7
8
9
10
11
mysql> SELECT descripcion, COUNT(descripcion) total
    -> FROM tabla1
    -> GROUP BY descripcion DESC
    -> LIMIT 2;
+-------------+-------+
| descripcion | total |
+-------------+-------+
| uno         |     1 |
| tres        |     2 |
+-------------+-------+
2 rows in set (0.00 sec)

Pero SI ORDENAS PRIMERO POR EL CAMPO TOTAL entonces obtienes el resultado esperado:

1
2
3
4
5
6
7
8
9
10
11
12
mysql> SELECT descripcion, COUNT(descripcion) total
    -> FROM tabla1
    -> GROUP BY descripcion
    -> ORDER BY total DESC
    -> LIMIT 2;
+-------------+-------+
| descripcion | total |
+-------------+-------+
| dos         |     3 |
| tres        |     2 |
+-------------+-------+
2 rows in set (0.00 sec)

Pequeña diferencia en código, pero enorme diferencia en el resultado, en resumen, no es lo mismo GROUP BY que ORDER BY.

Finalmente un comentario, hay que tener cuidado acerca de los "Empates", imagina que hubiera dos elementos con un total de 2 elementos, entonces SÓLO SE MOSTRARÍA EL PRIMERO DE ELLOS... insisto en que el LIMIT funciona a nivel de número de registros. Si te interesan también estos posibles casos de empate, entonces deberás hacer una consulta distinta.

Prueba y nos comentas,

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
1
Comentar
sin imagen de perfil

Consulta sql los 5 mas registrados

Publicado por Rafael (3 intervenciones) el 13/07/2015 20:21:44
Estimado su explicación ha sido muy clara y le agradezco por el tiempo, he podido resolver el problema de la manera que usted me explicó... ha sido de gran ayuda ya que esto era lo último que me quedaba por hacer ahora doy oficialmente por terminado el sistema web... muchas gracias leo.

PD: lo que si el tema de los empates lo tengo pendiente ya que solo muestra un solo registro de dos con el mismo numero de registro.
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