0

我有下表:

分数:

user_id | match_id | points
   1    |   110    |   4
   1    |   111    |   3
   1    |   112    |   3
   2    |   111    |   2

用户对比赛进行投注,并根据比赛结果获得积分。根据投注的准确性,一场比赛您将获得 0、2、3 或 4 分。

现在我想对用户进行排名,这样我就可以看到谁在第一、第二等等......排名顺序首先是按总点数。如果这些相等,则按用户获得 4 分的次数排序,然后按用户获得 3 分的次数排序,依此类推。

为此,我需要下表:

user_id |  total_points | #_of_fours | #_of_threes | #_of_twos
   1    |       10      |      1     |       2     |     0
   2    |        2      |      0     |       0     |     1

但我无法弄清楚可以帮助我获得它的连接语句。

这是我在没有帮助的情况下得到的:

SELECT user_id, COUNT( points ) AS #_of_fours FROM scores WHERE points = 4 GROUP BY user_id

这导致

user_id | #_of_fours
    1   |      1
    2   |      0

现在我必须为#_of_threes 和twos 以及总分做这件事,然后把它们加在一起,但我不知道怎么做。

顺便说一句,我正在使用 MySQL。

任何帮助都会非常感激。提前致谢

4

2 回答 2

2
SELECT  user_id
,       sum(points) as total_points
,       sum(case when points = 4 then 1 end) AS #_of_fours 
,       sum(case when points = 3 then 1 end) AS #_of_threes
,       sum(case when points = 2 then 1 end) AS #_of_twos
FROM    scores
GROUP BY 
        user_id
于 2012-08-25T11:25:21.800 回答
1

使用 mysql 语法,您可以SUM轻松地计算匹配的行数;

SELECT 
  user_id, 
  SUM(points)   AS total_points,
  SUM(points=4) AS no_of_fours,
  SUM(points=3) AS no_of_threes,
  SUM(points=2) AS no_of_twos
FROM Table1
GROUP BY user_id;

演示在这里

于 2012-08-25T11:26:59.817 回答