MySQL - Top 5 por categoría

 
Vista:
Imágen de perfil de Juan José
Val: 13
Ha aumentado 1 puesto en MySQL (en relación al último mes)
Gráfica de MySQL

Top 5 por categoría

Publicado por Juan José (6 intervenciones) el 01/03/2017 03:20:25
Hola a todos.
Quiero hacer una consulta donde me arroje un "top 5" por categoría como se puede ver en la imagen.
top-5
La tabla se llama paises_invitados, tiene 48 reglones de datos, y los campos son
id_pais
Pais
Estados
Usuarios

No me funcionó esta consulta:
1
2
3
4
5
SELECT
   *
FROM paises_invitados
GROUP BY Pais
ORDER BY Usuarios LIMIT 5;
¿Cómo tendría que hacerse la consulta?
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
Imágen de perfil de SuperIndio
Val: 2
Ha aumentado su posición en 35 puestos en MySQL (en relación al último mes)
Gráfica de MySQL

Top 5 por categoría

Publicado por SuperIndio (77 intervenciones) el 01/03/2017 15:47:49
Y Donde esta la columna categoria o que te referis con categoria?

O vos queres saber quienes son los 5 con mayor cantidad de usuarios?
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 Juan José
Val: 13
Ha aumentado 1 puesto en MySQL (en relación al último mes)
Gráfica de MySQL

Top 5 por categoría

Publicado por Juan José (6 intervenciones) el 01/03/2017 16:12:48
El título fue para generalizar el campo. La categoría es País y la subcategoría por ordenar es Estados.
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 SuperIndio
Val: 2
Ha aumentado su posición en 35 puestos en MySQL (en relación al último mes)
Gráfica de MySQL

Top 5 por categoría

Publicado por SuperIndio (77 intervenciones) el 01/03/2017 16:54:46
Es muy buena tu pregunta... via SQL no se me ocurre a menos de crear otra tabla y cargarla con las cosultas individuales por cada id_pais y despues hacer un query sobre esta segunda tabla

1
order by id_pais, usuarios desc;
cada query seria
1
2
3
4
5
SELECT  * FROM paises_invitados where Id_Pais = 1 ORDER BY Usuarios desc LIMIT 5;
 
SELECT  * FROM paises_invitados where Id_Pais = 2 ORDER BY Usuarios desc LIMIT 5;
 
SELECT  * FROM paises_invitados where Id_Pais = 3 ORDER BY Usuarios desc LIMIT 5;

lo he probado de distintas maneras y no hay caso a mnos que lo hagas a traves de un lenguaje de programacion

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
MariaDB [dblaweb]> SELECT  * FROM paises_invitados where Id_Pais = 1 ORDER BY Usuarios desc LIMIT 5;
+---------+----------------+-------------+------------+
| Id_pais | Pais           | Estados     | Usuarios   |
+---------+----------------+-------------+------------+
|       1 | Estados Unidos | Dallas      | 2147483647 |
|       1 | Estados Unidos | Houston     | 2147483647 |
|       1 | Estados Unidos | Miami       | 1545222767 |
|       1 | Estados Unidos | Los Angeles |  545222989 |
|       1 | Estados Unidos | Kansas      |  432423151 |
+---------+----------------+-------------+------------+
5 rows in set (0.00 sec)
 
MariaDB [dblaweb]>
MariaDB [dblaweb]> SELECT  * FROM paises_invitados where Id_Pais = 2 ORDER BY Usuarios desc LIMIT 5;
+---------+--------+-------------+------------+
| Id_pais | Pais   | Estados     | Usuarios   |
+---------+--------+-------------+------------+
|       2 | Mexico | Monterrey   | 2147483647 |
|       2 | Mexico | Durango     | 2147483647 |
|       2 | Mexico | Puebla      | 2147483647 |
|       2 | Mexico | Tijuana     |  543534534 |
|       2 | Mexico | Guadalajara |  524234234 |
+---------+--------+-------------+------------+
5 rows in set (0.00 sec)
 
MariaDB [dblaweb]>
MariaDB [dblaweb]> SELECT  * FROM paises_invitados where Id_Pais = 3 ORDER BY Usuarios desc LIMIT 5;
+---------+--------+---------------+-----------+
| Id_pais | Pais   | Estados       | Usuarios  |
+---------+--------+---------------+-----------+
|       3 | Espa±a | Barcelona     | 534576877 |
|       3 | Espa±a | Granada       | 345345354 |
|       3 | Espa±a | Alicante      | 243465452 |
|       3 | Espa±a | San Sebastian |  45334524 |
|       3 | Espa±a | Valencia      |  42445532 |
+---------+--------+---------------+-----------+
5 rows in set (0.00 sec)
 
MariaDB [dblaweb]>
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 Juan José
Val: 13
Ha aumentado 1 puesto en MySQL (en relación al último mes)
Gráfica de MySQL

Top 5 por categoría

Publicado por Juan José (6 intervenciones) el 01/03/2017 17:17:55
Hola.

Había pensado también en la propuesta que hiciste:
1
2
3
4
5
SELECT  * FROM paises_invitados where Id_Pais = 1 ORDER BY Usuarios desc LIMIT 5
UNION ALL
SELECT  * FROM paises_invitados where Id_Pais = 2 ORDER BY Usuarios desc LIMIT 5
UNION ALL
SELECT  * FROM paises_invitados where Id_Pais = 3 ORDER BY Usuarios desc LIMIT 5;

El problema se pone complicado si el número de países fuera muy grande.
Por lo pronto, sigo investigando y si encuentro la solución, la comparto.
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 SuperIndio
Val: 2
Ha aumentado su posición en 35 puestos en MySQL (en relación al último mes)
Gráfica de MySQL

Top 5 por categoría

Publicado por SuperIndio (77 intervenciones) el 01/03/2017 17:20:25
Nop! este asi no te va a funcionar, el union all cuando previamente hay un order by no se puede el order by tiene que ser al final de todo,
por ello he pensado en una segunda tabla donde cargas el resltado de cada query y despues hace un query
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 Juan José
Val: 13
Ha aumentado 1 puesto en MySQL (en relación al último mes)
Gráfica de MySQL

Top 5 por categoría

Publicado por Juan José (6 intervenciones) el 01/03/2017 17:29:21
Tienes razón, no me funcionó. Quizás se tiene que hacer subconsultas o terminar usando funciones.
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 SuperIndio
Val: 2
Ha aumentado su posición en 35 puestos en MySQL (en relación al último mes)
Gráfica de MySQL

Top 5 por categoría

Publicado por SuperIndio (77 intervenciones) el 01/03/2017 18:51:34
Ahi va
1
2
3
4
5
6
7
8
9
10
11
12
13
14
DROP TABLE IF EXISTS Top5 ;
 
Create Table Top5 (
Id_pais         Smallint       Not Null ,
Pais            Varchar (30)   Not Null ,
Estados         Varchar (30)   Not Null ,
Usuarios        Integer (15)   Not Null );
 
 
Insert into Top5 (Id_pais, Pais, Estados, Usuarios ) select Id_pais, Pais, Estados, Usuarios FROM paises_invitados where Id_Pais = 1 ORDER BY Usuarios desc LIMIT 5;
 
Insert into Top5 (Id_pais, Pais, Estados, Usuarios ) select Id_pais, Pais, Estados, Usuarios FROM paises_invitados where Id_Pais = 2 ORDER BY Usuarios desc LIMIT 5;
 
Insert into Top5 (Id_pais, Pais, Estados, Usuarios ) select Id_pais, Pais, Estados, Usuarios FROM paises_invitados where Id_Pais = 3 ORDER BY Usuarios desc LIMIT 5;

y el resultado:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
MariaDB [dblaweb]> select * from  Top5 order by Id_pais, Usuarios desc;
+---------+----------------+---------------+------------+
| Id_pais | Pais           | Estados       | Usuarios   |
+---------+----------------+---------------+------------+
|       1 | Estados Unidos | Dallas        | 2147483647 |
|       1 | Estados Unidos | Houston       | 2147483647 |
|       1 | Estados Unidos | Miami         | 1545222767 |
|       1 | Estados Unidos | Los Angeles   |  545222989 |
|       1 | Estados Unidos | Kansas        |  432423151 |
|       2 | Mexico         | Puebla        | 2147483647 |
|       2 | Mexico         | Durango       | 2147483647 |
|       2 | Mexico         | Monterrey     | 2147483647 |
|       2 | Mexico         | Tijuana       |  543534534 |
|       2 | Mexico         | Guadalajara   |  524234234 |
|       3 | Espa±a         | Barcelona     |  534576877 |
|       3 | Espa±a         | Granada       |  345345354 |
|       3 | Espa±a         | Alicante      |  243465452 |
|       3 | Espa±a         | San Sebastian |   45334524 |
|       3 | Espa±a         | Valencia      |   42445532 |
+---------+----------------+---------------+------------+
15 rows in set (0.00 sec)
 
MariaDB [dblaweb]>
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 Juan José
Val: 13
Ha aumentado 1 puesto en MySQL (en relación al último mes)
Gráfica de MySQL

Top 5 por categoría

Publicado por Juan José (6 intervenciones) el 01/03/2017 19:43:37
Esa sería una opción, sólo que si el número de países fuera más grande (unos 150), estaría complicado insertar país por país.
Encontré una solución:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
SELECT
    Estados,
    id_pais,
    Usuarios
FROM
(
    SELECT
        Estados,
        id_pais,
        Usuarios,
        @rn := IF(@prev = id_pais, @rn + 1, 1) AS rn,
        @prev := id_pais
    FROM paises_invitados
    JOIN (SELECT @prev := NULL, @rn := 0) AS vars
    ORDER BY id_pais, Usuarios DESC, Estados
) AS T1
WHERE rn <= 5;

Ya lo probé para un "top 3", un "top 4" o un "top 10".
Gracias por la ayuda.
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