MySQL - Problema síntasis MAX(COUNT(*))

   
Vista:

Problema síntasis MAX(COUNT(*))

Publicado por Rodrigo (4 intervenciones) el 21/05/2013 21:44:01
Muy buenas
Estoy haber si saco un ejercicio que nos ha propuesto mi profesor en el que no encuentro la solucion y tiene que ver mucho con este hilo

La cuestión esta en que tengo una tabla con una sola columna de la nota de varios alumnos:
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
mysql> select Nota from Notas;
+------+
| Nota |
+------+
|    5 |
|    4 |
|    2 |
|    7 |
|    3 |
|    0 |
|    1 |
|    4 |
|    8 |
|    0 |
|    2 |
|    7 |
|    5 |
|   10 |
|    5 |
|    5 |
|    6 |
|    0 |
|    0 |
|    0 |
|    0 |
+------+
21 rows in set (0.00 sec)

Debo de sacar la nota que mas se repite que en este caso es el 0 (6 repeticiones) sin utilizar ni la clausula GROUP BY ni HAVING

Mi intento es:
1
2
3
4
mysql> select count(Nota) from Notas
    ->  where count(Nota)
    -> in (select Nota from Notas where Nota=max(Nota));                        ERROR 1111 (HY000): Invalido uso de función en grupo
mysql>

Pero como veis no es asi.
Agradeceria enormemente la rapidez con que alguien me pudiera hechar una mano ya que conseguiria una notaza en la evaluación
Muchas gracias espero respuesta
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
información
Otras secciones de LWP con contenido de MySQL
- Cursos de MySQL
- Temas de MySQL
- Chat de MySQL
información
Cursos y Temas de MySQL
- Almacenando contraseñas en MySQL
- Cómo configurar MySQL
- Mysql Control Center

Problema síntasis MAX(COUNT(*))

Publicado por Wiliam Alexander Brito Viñas (4 intervenciones) el 21/05/2013 23:32:09
SELECT Notas.Nota
FROM Notas
GROUP BY Notas.Nota
ORDER BY Count(Notas.Nota) DESC
LIMIT 1;
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

Problema síntasis MAX(COUNT(*))

Publicado por Rodrigo (4 intervenciones) el 21/05/2013 23:39:59
No debo utilizar ni la clausula group by ni having pero muchas gracias por opinar.
He llegado a pensar que nos esta tomando el pelo y no se puede jajaja
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

Problema síntasis MAX(COUNT(*))

Publicado por leonardo_josue (81 intervenciones) el 22/05/2013 17:23:01
Hola Rodrigo:

¿¿¿No puedes utilizar GROUP BY en ninguna parte de la consulta???

Porque se me ocurre una forma de hacerlo con subconsultas, pero necesariamente sería con al menos un GROUP BY.... seria así:

1. no puede hacer un MAX(COUNT(*)) como supongo que ya te habrás dado cuenta, sin embargo sí puedes hacer lo siguiente:

1
2
SELECT MAX(T.campo) FROM
(  SELECT COUNT(*) FROM tabla) T


Es decir, utilizar una subconsulta para obtener en dos momentos distintos el valor máximo de repeticiones... con tus datos sería así:

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
mysql> SELECT * FROM notas;
+------+
| nota |
+------+
|    5 |
|    4 |
|    2 |
|    7 |
|    3 |
|    0 |
|    1 |
|    4 |
|    8 |
|    0 |
|    2 |
|    7 |
|    5 |
|   10 |
|    5 |
|    5 |
|    6 |
|    0 |
|    0 |
|    0 |
|    0 |
+------+
21 rows in set (0.00 sec)
 
mysql> SELECT MAX(total) max_total FROM
    ->    (  SELECT COUNT(nota) total
    ->       FROM notas
    ->       GROUP BY nota) T1;
+-----------+
| max_total |
+-----------+
|         6 |
+-----------+
1 row in set (0.00 sec)


Ahora si, este valor te puede servir para FILTRAR los resultados del conteo...

Otro TIP, no intentes hace algo como esto:

1
2
3
4
SELECT nota, COUNT(nota) total
FROM notas
WHERE COUNT(nota) = (al valor de la consulta que puse arriba)
GROUP BY nota


Esto TAMPOCO SE PUEDE HACER, porque es el mismo problema, el campo COUNT(nota) es un campo calculado que existe hasta después de la ejecución de la consulta... sin embargo de la misma manera como utilizas subconsultas, podrías hacer algo como esto:

1
2
SELECT * FROM ( aquí pones la consulta que te calcula el total notas que existen) T
WHERE T.campo_count = (aquí pones la consulta que calcula la máxima cantidad de notas)


Creo que con esto debería ser suficiente para obtener la consulta... 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

Problema síntasis MAX(COUNT(*))

Publicado por leonardo_josue (81 intervenciones) el 22/05/2013 21:01:21
Hola de nuevo:

He ideado una forma en la que puedes obtener el mismo resultado sin utilizar GROUP BY ni HAVING, pero que requiere la utilización de dos variables de usuario. La idea es simular la función ROW_NUMBER: checa esta liga:

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

a partir de esta idea, podrías hacer lo siguiente:

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
mysql> SET @iprev=0, @jprev=0;
Query OK, 0 rows affected (0.24 sec)
 
mysql> SELECT nota, row_number
    -> FROM (
    ->   SELECT nota,
    ->   @jprev := IF(@iprev = nota, @jprev + 1, 1) row_number,
    ->   @iprev := nota AS i
    ->   FROM notas
    ->   ORDER BY nota
    -> ) AS tmp;
+------+------------+
| nota | row_number |
+------+------------+
|    0 |          1 |
|    0 |          2 |
|    0 |          3 |
|    0 |          4 |
|    0 |          5 |
|    0 |          6 |
|    1 |          1 |
|    2 |          1 |
|    2 |          2 |
|    3 |          1 |
|    4 |          1 |
|    4 |          2 |
|    5 |          1 |
|    5 |          2 |
|    5 |          3 |
|    5 |          4 |
|    6 |          1 |
|    7 |          1 |
|    7 |          2 |
|    8 |          1 |
|   10 |          1 |
+------+------------+
21 rows in set (0.05 sec)


Observa que se utilizan dos variables iprev y jprev... una sirve para ir contabilizando los valores repetidos y la otra para verificar qué nota fue la anterior... la sintaxis está algo confusa, pero el funcionamiento es bastante sencillo... a partir de esta consulta, simplemente tendrías que ordenar por el campo ROW_NUMBER de manera descendente y extraer el primer registro:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
mysql> SELECT nota, row_number
    -> FROM (
    ->   SELECT
    ->     nota,
    ->     @jprev := IF(@iprev = nota, @jprev + 1, 1) row_number,
    ->     @iprev := nota AS i
    ->   FROM notas
    ->   ORDER BY nota
    -> ) AS tmp
    -> ORDER BY row_number DESC LIMIT 1;
+------+------------+
| nota | row_number |
+------+------------+
|    0 |          6 |
+------+------------+
1 row in set (0.00 sec)


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
Imágen de perfil de xve

Problema síntasis MAX(COUNT(*))

Publicado por xve (899 intervenciones) el 22/05/2013 22:57:48
Impresionante Leo!!! estoy aprendiendo un montón viendo tus ejemplos...
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

Problema síntasis MAX(COUNT(*))

Publicado por Rodrigo (4 intervenciones) el 22/05/2013 21:28:42
Entiendo.. bien ejemplificado

Pero tengo problemas al hacer la segunda consulta que me propones en la que se calcula la cantidad maxima de notas
Porque me sale la maxima nota de las notas en total.
1
2
3
4
5
6
7
mysql> select max(Nota)from Notas;
+-----------+
| max(Nota) |
+-----------+
|        10 |
+-----------+
1 row in set (0.00 sec)


Pero no la maxima cantidad de notas
Me quedo aqui:
1
mysql> SELECT * FROM (select count(Nota) from Notas) T WHERE T.Notas count = (aquí pones la consulta que calcula la máxima cantidad de notas);


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

Problema síntasis MAX(COUNT(*))

Publicado por Rodrigo (4 intervenciones) el 22/05/2013 22:57:38
Perdona no habia visto tu comentario anterior
Todo perfecto gracias por poner el empeño
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

Problema síntasis MAX(COUNT(*))

Publicado por leonardo_josue (81 intervenciones) el 23/05/2013 18:22:12
Hola de nuevo:

Ayer por la tarde se me ocurrió una manera más sencilla para hacer la consulta que quieres, igual, sin utilizar GROUP BY ni HAVING, y en este caso, sin necesitar tampoco de variables de usuario... sería así:

1
2
3
4
5
6
7
8
9
10
11
12
13
mysql> SELECT
    ->    DISTINCT nota,
    ->    ( SELECT COUNT(nota)
    ->      FROM notas N2
    ->      WHERE N1.nota = N2.nota) total
    -> FROM notas N1
    -> ORDER BY total DESC LIMIT 1;
+------+-------+
| nota | total |
+------+-------+
|    0 |     6 |
+------+-------+
1 row in set (0.02 sec)


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

Problema síntasis MAX(COUNT(*))

Publicado por William Alexander Brito Viñas (4 intervenciones) el 31/05/2013 22:41:22
Ninguno de los procedimientos anteriores tiene en cuenta la posibilidad de que los valores almacenados en la columna Nota, sigan una distribucion multimoda.
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

Problema síntasis MAX(COUNT(*))

Publicado por jhonathan moreno jhonathanew10@gmail.com (1 intervención) el 23/09/2015 00:43:21
hola leo viendo todas estas soluciones que das se ve q entiendes mucho de esto te quiero hacer una consulta que tengo con mi base de datos espero que me puedas ayudar por favor responde si estas para hacerte la consulta. 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