简体   繁体   English

如何使用groupby对mysql进行排名

[英]How to rank mysql with groupby

Guy I am trying to ranking some data from my database, and I notice that it's going very wrong when I put the group by clause; 伙计,我正在尝试对数据库中的某些数据进行排名,并且我注意到在放入group by子句时这是非常错误的。

SET @rank=0;

SELECT @rank:=@rank+1 AS RankSemGenero
    ,a.nome AS Artista
    ,f.nome AS Musica
    ,SUM(rnk.total) AS Tocadas
    ,rnk.mes AS Mes
    ,rnk.dia AS Dia
    ,current_timestamp() AS Criado_Em_Sem_Genero
    ,23 AS RankComGenero
    ,current_timestamp() AS Criado_Em_Com_Genero
    /*,CASE rnk.categoria
        WHEN 1 then 'AM'
        WHEN 2 then 'FM'
        WHEN 3 then 'Web'
        WHEN 4 then 'Comunitaria'
    END AS Categoria_Radio*/
    ,'Todas' AS TipoEmissora
    ,5 AS Relevancia_Emissora
    ,'Nacional' AS Local
    ,5 AS Relevancia_Local
    ,1 AS fl_ativo
FROM rnk201901 rnk
LEFT JOIN artistas a ON rnk.artista = a.id
LEFT JOIN fonogramas f ON rnk.fonograma = f.id
WHERE rnk.dia = 10
-- AND rnk.fonograma = 35876
-- GROUP BY rnk.fonograma
ORDER BY rnk.total DESC;

This code above bringing the information on the right way 1 until .... 上面的代码以正确的方式将信息带到1...。

But if I change the GROUP BY line, I am receiving something like: 1700 instead of 1. 但是,如果我更改GROUP BY行,则会收到类似:1700而不是1的信息。

GROUP BY rnk.fonograma

Any idea how to handle this group by counting 1 by 1? 知道如何通过1比1来处理该组吗?

Thanks!! 谢谢!!

You need to use a subquery, when using variables with group by : 将变量与group by一起使用时,需要使用子查询:

select (@rank := @rank + 1) as rank, t.*
from (<your aggregation query here with order by>) t cross join
     (select @rank := 0) params;

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM