MySQL查询,对多个列进行计数和评分
我有一个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(
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分排名第一
-4分rank_2
-3分rank_3
-2分rank_4
-1分rank_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 |
下面是演示示例数据和基于它的所需输出,尤其是以