MySQL查询,对多个列进行计数和评分

MySQL查询,对多个列进行计数和评分,mysql,sql,Mysql,Sql,我有一个MySQL表,如下所示: player_rankings | CREATE TABLE `player_rankings` ( `id` int(11) NOT NULL AUTO_INCREMENT, `user_id` int(11) NOT NULL, `award_id` int(11) NOT NULL, `rank_1` int(11) DEFAULT NULL, `rank_2` int(11) DEFAULT NULL, `rank_3` int(

我有一个MySQL表,如下所示:

player_rankings | CREATE TABLE `player_rankings` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `user_id` int(11) NOT NULL,
  `award_id` int(11) NOT NULL,
  `rank_1` int(11) DEFAULT NULL,
  `rank_2` int(11) DEFAULT NULL,
  `rank_3` int(11) DEFAULT NULL,
  `rank_4` int(11) DEFAULT NULL,
  `rank_5` int(11) DEFAULT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `user_id` (`user_id`,`award_id`)
) 
rank_1
rank_5
包含我在另一个表中拥有的玩家ID,但就本查询而言,它不相关。我想做的是计算一个值在每个
rank.*
列中出现的次数,然后给它以下分数:

  • 排名第一
    -5分
  • rank_2
    -4分
  • rank_3
    -3分
  • rank_4
    -2分
  • rank_1
    -1分

最终结果将按照玩家ID的总点数从高到低(降序)排序

对于您的表结构,最好的解决方案可能是在脚本中计算所有内容。只需获取所有行,然后计算

如果您想在一个SQL查询中实现所有查询,那么可以尝试对5个子查询使用UNION

SELECT user_id, rank FROM(
   SELECT rank_1 AS user_id, 5 AS rank FROM player_rankings
   UNION
   SELECT rank_2 AS user_id, 4 AS rank FROM player_rankings
   ....
) AS u;

没有工作脚本,但我希望您理解我的解决方案,以获得每个等级的分数总和:

SELECT user_id,
  sum(rank1Points) rank1Points,
  sum(rank2Points) rank2Points,
  sum(rank3Points) rank3Points,
  sum(rank4Points) rank4Points,
  sum(rank5Points) rank5Points
FROM (
  SELECT pr.rank_1 user_id, count(*) * 5 rank1Points, 0 rank2Points, 0 rank3Points, 0 rank4Points, 0 rank5Points
  FROM player_rankings pr
  GROUP BY pr.rank_1
  UNION ALL
  SELECT pr.rank_2, 0, count(*) * 4, 0, 0, 0
  FROM player_rankings pr
  GROUP BY pr.rank_2
  UNION ALL
  SELECT pr.rank_3, 0, 0, count(*) * 3, 0, 0
  FROM player_rankings pr
  GROUP BY pr.rank_3
  UNION ALL
  SELECT pr.rank_4, 0, 0, 0, count(*) * 2, 0
  FROM player_rankings pr
  GROUP BY pr.rank_4
  UNION ALL
  SELECT pr.rank_5, 0, 0, 0, 0, count(*)
  FROM player_rankings pr
  GROUP BY pr.rank_5
) s
GROUP BY user_id
小提琴

要在一列中获得总点数,请执行以下操作:

SELECT user_id,
  sum(rankPoints) rankPoints
FROM (
  SELECT pr.rank_1 user_id, count(*) * 5 rankPoints
  FROM player_rankings pr
  GROUP BY pr.rank_1
  UNION ALL
  SELECT pr.rank_2, count(*) * 4
  FROM player_rankings pr
  GROUP BY pr.rank_2
  UNION ALL
  SELECT pr.rank_3, count(*) * 3
  FROM player_rankings pr
  GROUP BY pr.rank_3
  UNION ALL
  SELECT pr.rank_4, count(*) * 2
  FROM player_rankings pr
  GROUP BY pr.rank_4
  UNION ALL
  SELECT pr.rank_5, count(*)
  FROM player_rankings pr
  GROUP BY pr.rank_5
) s
GROUP BY user_id
拉小提琴。

试试看

SELECT user_id, SUM(6 - rank) points
  FROM
(
  SELECT rank,
         CASE rank 
            WHEN 1 THEN rank_1
            WHEN 2 THEN rank_2
            WHEN 3 THEN rank_3
            WHEN 4 THEN rank_4
            WHEN 5 THEN rank_5
         END user_id
    FROM player_rankings t CROSS JOIN
  (
    SELECT 1 rank UNION ALL
    SELECT 2 UNION ALL
    SELECT 3 UNION ALL
    SELECT 4 UNION ALL
    SELECT 5 
  ) i
) q
 GROUP BY user_id
 ORDER BY points DESC
此查询背后的思想是首先取消对表的分割,然后在分组时计算每个用户id的点数,然后按点数对结果集进行排序。多功能查询

样本输出:

| USER_ID | POINTS | |---------|--------| | 50 | 13 | | 10 | 12 | | 30 | 12 | | 20 | 9 | | 40 | 5 | | 60 | 4 | | 70 | 3 | | 80 | 2 | |用户ID |点数| |---------|--------| | 50 | 13 | | 10 | 12 | | 30 | 12 | | 20 | 9 | | 40 | 5 | | 60 | 4 | | 70 | 3 | | 80 | 2 |
下面是演示

示例数据和基于它的所需输出,尤其是以