对 mysql 数据进行计数和分组

counting and grouping mysql data

说我有一个 table 有这样的数据 - 一个假设的赛车游戏

在每局游戏结束时,用户的姓名、他们在游戏中的位置以及他们赢得的奖金都会添加到 table

 *****************************************
 | name  | place | date       | winnings |
 | bob   | 1     | 2015-07-08 | 100      |
 | bob   | 2     | 2015-07-07 | 75       |
 | john  | 1     | 2015-07-07 | 100      |
 | john  | 1     | 2015-07-04 | 100      |
 | sarah | 9     | 2015-07-05 | 1000     |
 *****************************************

我将使用以下查询来获取此

 select h.name, z.place, z.date, z.winnings from races as z, users as h where h.id  = z.user_id order by date desc 

我的问题是

我怎样才能让它输出这样的东西? (将奖金加在一起排序)

 **************************
 | name  | total_winnings |
 | sarah | 1000           |
 | john  | 200            |
 | bob   | 175            |
 **************************

以及他们赢了多少次(排在第一位)

 ***************************
 | name  | won_first_place |
 | john  | 2               |
 | bob   | 1               |
 | sarah | 0               | 
 ***************************

谢谢

您可以类似地处理这两个查询,因为它们都需要按用户分组。

SELECT 
    users.name, 
    SUM(races.winnings) AS total_winnings
FROM users INNER JOIN races ON users.id  = races.user_id
GROUP BY users.id
ORDER BY SUM(races.winnings) DESC

应该让你得到总奖金,并且

SELECT 
    users.name, 
    SUM(CASE WHEN races.place=1 THEN 1 ELSE 0 END) AS won_first_place
FROM users INNER JOIN races ON users.id  = races.user_id
GROUP BY users.id
ORDER BY SUM(CASE WHEN races.place=1 THEN 1 ELSE 0 END) DESC

应该让你得到用户获得第一名的次数。

当您使用 GROUP BY 时,您可以对分组行中的列使用许多不同的聚合函数,例如 SUM。您可以查看 MySQL documentation 了解其他选项。