0

出于某种原因,这似乎很容易,但我无法弄清楚。所以我有一个名为“contest_entries”的表,其中有“用户名”和“评级”列。

表格内容如下:

Username | rating | Contest_id
John     | 3      |   4
Mike     | 1      |   4
Eric     | 3      |   5
Mike     | 1      |   6
John     | 2      |   7
Mike     | 1      |   8 
John     | 1      |   9

所以对于不同的比赛,人们可以安排不同的位置,

我的问题是如何显示一个用户名赢得了多少次比赛,获得了第二名或第三名(获得第一名,也就是评级=1,第二名是评级=2,第三名是评级=3)并将所有用户名列为好吧,即使用户名从未获得过第 1、第 2、第 3 名。然后最后按谁赢得最多(谁拥有最多“评级=1”)对他们进行排名。

所以它看起来像这样:

Username   |  Ranking | 1st places | Second Places | Third Places
Mike       |     1    |    3       |    0          |    0
John       |     2    |    1       |    1          |    1
Eric       |     3    |    0       |    0          |    1

etc etc.
4

2 回答 2

1
SELECT x.username
     , COUNT(CASE WHEN rating = 1 THEN 'foo' END) first 
     , COUNT(CASE WHEN rating = 2 THEN 'foo' END) second 
     , COUNT(CASE WHEN rating = 3 THEN 'foo' END) third
  FROM ratings x 
 GROUP 
    BY username;
于 2013-06-29T18:53:40.453 回答
0

尝试

SELECT username, @n := @n + 1 ranking, `1st places`, `2nd places`, `3rd places`
  FROM
(
  SELECT username,
  SUM(CASE WHEN rating = 1 THEN 1 ELSE 0 END) `1st places`,
  SUM(CASE WHEN rating = 2 THEN 1 ELSE 0 END) `2nd places`,
  SUM(CASE WHEN rating = 3 THEN 1 ELSE 0 END) `3rd places`
    FROM Table1
   GROUP BY username
   ORDER BY `1st places` DESC
) q, (SELECT @n := 0) n

输出:

| 用户名 | 排名 | 第一名 | 第二名 | 第三名 |
-------------------------------------------------- ------------
| 迈克 | 1 | 3 | 0 | 0 |
| 约翰 | 2 | 1 | 1 | 1 |
| 埃里克 | 3 | 0 | 0 | 1 |

这是SQLFiddle演示

于 2013-06-29T18:56:49.120 回答