带order by的mysql行号

nhaq1z21  于 2021-06-20  发布在  Mysql
关注(0)|答案(2)|浏览(269)

现在我有这个:

SELECT
@rownum := @rownum + 1 AS rownum,
T1.*
FROM
(
    SELECT user.username, points
    FROM scores
    JOIN users AS user ON user.id = scores.user_id
) AS T1, (SELECT @rownum := 0) AS r
ORDER BY T1.points DESC, rownum ASC

这将返回用户名、点数和行号。点是有序的,但行号都是乱七八糟的。如果我将order by放入嵌套的select中,那么行numers是有序的,而点不是。所以我需要改变的是,我得到的分数按降序排列,行号按升序排列,我要创建的是排行榜,这样用户的得分最多的是第一位等等。

beq87vna

beq87vna1#

这是你想要的吗?

SELECT (@rownum := @rownum + 1) AS rownum,
       us.*
FROM (SELECT u.username, s.points
      FROM scores s JOIN
           users u
           ON u.id = s.user_id
      ORDER BY s.points DESC
     ) us CROSS JOIN
     (SELECT @rownum := 0) params;

基本上,这只是在子查询中保留顺序。
如果 points 不是数字,那就用 ORDER BY (s.points + 0) DESC 在子查询中。或者将数据固定为数字。

pbossiut

pbossiut2#

看来你需要你的帮助 rownum 与…配对 points 已经预定了。所以你需要搬家 ORDER BYpoints 进入嵌套选择:

SELECT
@rownum := @rownum + 1 AS rownum,
T1.*
FROM
(
    SELECT user.username, points
    FROM scores
    JOIN users AS user ON user.id = scores.user_id
    ORDER BY points DESC
) AS T1, (SELECT @rownum := 0) AS r
ORDER BY rownum ASC

相关问题