【问题标题】:counting and grouping mysql data对mysql数据进行计数和分组
【发布时间】:2015-09-24 05:40:36
【问题描述】:

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

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

 *****************************************
 | 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               | 
 ***************************

谢谢

【问题讨论】:

  • 您尝试生成的两个查询中的日期列的含义是什么?
  • 清理了它。对困惑感到抱歉。日期列对于前两个并不重要
  • 你能否给出一个期望的输出,而不是两个,并且让描述与结果匹配以避免混淆?

标签: php mysql php-5.3


【解决方案1】:

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

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 了解其他选项。

【讨论】:

  • 好像没有考虑总名额
  • @vonUbisch 我认为,基于问题中的第一个表格表示,place 列似乎代表用户获得第一名的次数,而不是他们获得的位置。
  • 我绝对理解这种混淆,OP 应该给出一个想要的输出。 as well as how sorted by how many times they won (were first place)
  • @vonUbisch 据我所知,问题中的第三个示例确实似乎是 place 列的总和。
  • 你是对的,但这与所需输出的描述相矛盾。 OP应该澄清。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-07-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-06-17
相关资源
最近更新 更多