【问题标题】:Rank function in MySQL assign a rankMySQL中的Rank函数分配等级
【发布时间】:2016-12-17 10:43:53
【问题描述】:

我需要为 TC5 而不是 id 分配等级。

SELECT a.id, a.user_id, a.tc1, a.tc4, min(a.tc5), a.tc2, b.avatar, c.username, @curRank := @curRank + 1 AS Rank
FROM 
treningove_casy a INNER JOIN  
sn_users b ON a.user_id=b.id INNER JOIN
users c ON a.user_id=c.id , (SELECT @curRank := 0) r
WHERE  a.tc2 LIKE  'Motokáry Modrice' 
GROUP BY a.user_id

那画面怎么样。请帮忙

修改后的代码

SELECT x.*, (@curRank := @curRank + 1) as Rank
FROM (SELECT a.id, a.user_id, a.tc1, a.tc4, min(a.tc5) as tc5,
             a.tc2, b.avatar, c.username, 
      FROM sbhgl_chronoengine_chronoforms_datatable_treningove_casy a INNER JOIN  
           sbhgl_jsn_users b
           ON a.user_id = b.id INNER JOIN
           sbhgl_users c
           ON a.user_id = c.id 
      WHERE  a.tc2 LIKE  'Motokáry Modřice' 
      GROUP BY a.user_id
     ) x CROSS JOIN
     (SELECT @curRank := 0) params
ORDER BY tc5 DESC;

【问题讨论】:

  • 您需要使用ORDER BY tc5
  • 您的查询有问题,因为您在使用GROUP BY 时选择了非聚合列。

标签: mysql sql rank


【解决方案1】:
SELECT a.id, a.user_id, a.tc1, a.tc4, a.tc2, b.avatar, c.username, 
    (select rank from (SELECT 
        IF (@score=s.tc5, @rank:=@rank, @rank:=@rank+1) rank,
        @score:=s.tc5 tc5s
        FROM treningove_casy s,
        (SELECT @score:=0, @rank:=0) r
        ORDER BY tc5 DESC) s ) as rank
FROM 
treningove_casy a INNER JOIN  
sn_users b ON a.user_id=b.id INNER JOIN
users c ON a.user_id=c.id , (SELECT @curRank := 0) r
WHERE  a.tc2 LIKE  'Motokáry Modrice' 
GROUP BY a.user_id

您可以尝试以上解决方案,希望对您有所帮助。

【讨论】:

  • 您的子查询不能返回SELECT 列表中的多行。
  • 您好,感谢您的帮助,我输入了此代码。我收到一个错误:SQLSTATE [21000]:基数违规:1242 子查询返回超过 1 行
【解决方案2】:

在 MySQL 中,您通常使用变量来表示排名。在您的情况下,您将使用子查询。我发现变量方法并不总是适用于GROUP BY

SELECT x.*, (@curRank := @curRank + 1) as Rank
FROM (SELECT a.id, a.user_id, a.tc1, a.tc4, min(a.tc5) as tc5,
             a.tc2, b.avatar, c.username, 
      FROM treningove_casy a INNER JOIN  
           sn_users b
           ON a.user_id = b.id INNER JOIN
           users c
           ON a.user_id = c.id 
      WHERE  a.tc2 LIKE  'Motokáry Modrice' 
      GROUP BY a.user_id
     ) x CROSS JOIN
     (SELECT @curRank := 0) params
ORDER BY tc5 DESC;

注意:使用表别名是好的。但是,如果别名是表名的缩写,则更容易理解查询。

【讨论】:

  • 您好,感谢您的帮助,我输入了此代码。我收到一个错误:SELECT [8] 中的未知 15 expr_type
  • @MotoKartCup 。 . .子查询是否运行?我没有看到任何会导致这样的错误的东西。
  • 我添加了修改后的代码。仍然写错误:15 unknown expr_type in SELECT[8]
猜你喜欢
  • 2013-06-28
  • 1970-01-01
  • 1970-01-01
  • 2012-06-08
  • 2022-01-04
  • 2021-07-28
  • 2021-12-06
  • 1970-01-01
  • 2023-04-10
相关资源
最近更新 更多