SQL加入问题 - 用户投注比赛

时间:2012-08-25 11:17:36

标签: sql

我有下表:

分数:

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

用户在比赛中下注并根据比赛结果获得积分。根据投注的准确程度,您可以获得0分,2分,3分或4分的比赛。

现在我想对用户进行排名,以便我可以看到谁在第一,第二位等... 排名顺序首先是total_points。如果这些是相等的,则按用户得分为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以及总积分做到这一点并将它们加在一起,但我无法弄清楚如何。

BTW我正在使用MySQL。

任何帮助都会非常令人沮丧。提前致谢

2 个答案:

答案 0 :(得分: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

答案 1 :(得分: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;

演示here