使用SUM()和ORDER BY的MYSQL行序列

vmdwslir  于 2022-12-03  发布在  Mysql
关注(0)|答案(2)|浏览(128)

我尝试按用户的总点数对行进行排序。
SUMORDER BY工作正常。但我还想添加行的序列号。
当我尝试使用@row_number时,我得到一些数字,但顺序不正确。

正确的num列顺序应该是1,2,3,4,因为我使用的是按用户点数总和的total_point排序。
如何获得num列的正确序列?

SELECT 
users.user_id, 
users.user_hash, 
(@row_number:=@row_number + 1) AS num,
sum(total_point) as total_point

FROM (SELECT @row_number:=0) AS t,user_stats
LEFT JOIN users on users.user_id = user_stats.stats_user_id
WHERE create_date BETWEEN "2020-04-01 00:00:00" AND "2020-04-30 23:59:59"
GROUP BY stats_user_id
ORDER BY total_point DESC

最新版本:mysql5.7

kwvwclae

kwvwclae1#

您必须将用于总排序行,并为它们指定一个数字

SELECT 
    user_id,
    user_hash,
    users.user_nick,
    (@row_number:=@row_number + 1) AS num,
    total_point
FROM
    (SELECT 
        users.user_id,
        users.user_hash,
        users.user_nick,
        SUM(total_point) AS total_point
    FROM
        user_stats
    LEFT JOIN users ON users.user_id = user_stats.stats_user_id
    WHERE
        create_date BETWEEN '2020-04-01 00:00:00' AND '2020-04-30 23:59:59'
    GROUP BY stats_user_id
    ORDER BY total_point DESC) t1,
    (SELECT @row_number:=0) AS t
ORDER BY num ASC;
xu3bshqb

xu3bshqb2#

要在MySQL中生成一系列带有SUM列的行,并按该列对结果进行排序,可以使用ROW_NUMBER()函数和一个子查询。下面是一个示例:

SELECT *
FROM (
  SELECT
    ROW_NUMBER() OVER (ORDER BY SUM(value) ASC) AS seq,
    SUM(value) AS total
  FROM my_table
  GROUP BY group_id
) AS t
ORDER BY seq ASC;

此查询将为my_table中的每个组生成一个行序列,其中seq列包含行号,total列包含该组的value列的总和。这些行将按total列以升序排序。
ROW_NUMBER()函数为结果集中的每一行生成一个连续的整数值。OVER子句指定应按SUM(value)列以升序对行进行排序。GROUP BY子句按group_id列对行进行分组,SUM()函数计算每个组的value列的总和。
外部SELECT语句将内部查询 Package 在子查询中

相关问题