mysql - 从排名中排除得分为零的用户

标签 mysql

我遇到了一个很好的解决方案,可以根据用户在 mysql 中的分数对用户进行排名。

SELECT  d.*, c.ranks
FROM
        (
          SELECT    Score, @rank:=@rank+1 Ranks
          FROM
                  (
                      SELECT  DISTINCT Score 
                      FROM    tableName a
                      ORDER   BY score DESC
                  ) t, (SELECT @rank:= 0) r
        ) c 
        INNER JOIN tableName d
            ON c.score = d.score

但是,我想知道是否有办法将得分为 0 或没有得分的用户从排名中排除,但仍然在结果中返回这些用户。

比如

KEY     username    password    score   Ranks
1       Anna        123         8       1
2       Bobby       345         5       2
3       Helen       678         5       2
4       Jon         567         -2      3
5       Arthur      ddd         -9      4
4       Chris       444         0       
5       Liz         eee         0       

最佳答案

既然你想选择你所有的用户,那么从这里开始:

SELECT
  user.*
FROM user

现在,我们要添加排名用户表,因此我们将开始增加复杂性。我们的目标是获得排名用户的临时表,因此我们将 LEFT JOIN 不过滤掉任何非排名用户。

SELECT
  user.*,
ranked_user.score,
ranked_user.rank
FROM user
LEFT JOIN(
  // subquery
) AS ranked_user ON ranked_user.user_id = user.id

然后我们必须找出确定排名的子查询部分。您已经掌握了大部分内容,我将添加一个 IF 语句,以便仅在他们有分数时才分配排名。总之,你得到这个:

SELECT
  user.*,
  ranked_user.score,
  ranked_user.rank
FROM user
LEFT JOIN(
  SELECT
    score,
    user_id,
    IF(score = 0 OR score IS NULL, null, @rank:=@rank+1) AS rank
  FROM(
    SELECT
      DISTINCT score,
      user_id
    FROM stat
    ORDER BY score DESC
  ) t, (SELECT @rank:= 0) r
) ranked_user ON ranked_user.user_id = user.user_id

IF 语句的工作原理如下:

IF(score = 0 OR score IS NULL,
# if c.score is 0 or missing

null,
# set the value to null

@rank:=@rank+1) 
# otherwise, calculate a rank

AS rank
# call this value "rank"

请注意:我会更改 user.* 并实际列出您想要的 user 的每一列。这被认为是最佳实践。

关于mysql - 从排名中排除得分为零的用户,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28892510/

相关文章:

mysql - 使用 Join 和 Group By 计算行数 - mysql 、 knex

php - SQL不插入数据库

php - 在 phpMyAdmin 中找不到权限

mysql - vbscript 中的安全 MySQL 查询

mysql - 使 PDO 数据库连接在 Controller 和模型中可用

从 URL 参数获取 MySQL 行的 PHP 代码

MySQL:从 MyISAM 转换为 InnoDB 使查询更快......?

mysql - 具有多个数据库的 Spring REST

mysql - 如何重置mysql密码

mysql查询返回不同的日期