查询统计数据库以获取不同事件的计数

时间:2013-05-02 07:57:22

标签: mysql count group-by

我正在建立一个拥有这些牌桌的足球联赛数据库:

+---------------------+
| Tables_in_league484 |
+---------------------+
| player              |
| statevent           |
+---------------------+
18 rows in set (0.09 sec)

并且所讨论的播放器表格看起来像这样,

mysql> desc player;
+-----------+-------------+------+-----+---------+----------------+
| Field     | Type        | Null | Key | Default | Extra          |
+-----------+-------------+------+-----+---------+----------------+
| pid       | int(11)     | NO   | PRI | NULL    | auto_increment |
| lastname  | varchar(55) | YES  |     | NULL    |                |
| firstname | varchar(85) | YES  |     | NULL    |                |
| dob       | date        | YES  |     | NULL    |                |
| posid     | int(11)     | YES  | MUL | NULL    |                |
| tid       | int(11)     | YES  | MUL | NULL    |                |
| shirtnum  | int(11)     | YES  |     | NULL    |                |
| email     | varchar(85) | YES  |     | NULL    |                |
+-----------+-------------+------+-----+---------+----------------+
8 rows in set (0.09 sec)

posid是位置表的fk; tid是团队表的fk;

mysql> desc statevent;
+--------+-------------+------+-----+---------+----------------+
| Field  | Type        | Null | Key | Default | Extra          |
+--------+-------------+------+-----+---------+----------------+
| eid    | int(11)     | NO   | PRI | NULL    | auto_increment |
| gid    | int(11)     | YES  | MUL | NULL    |                |
| pid    | int(11)     | YES  | MUL | NULL    |                |
| minute | int(11)     | YES  |     | NULL    |                |
| typeid | int(11)     | YES  |     | NULL    |                |
+--------+-------------+------+-----+---------+----------------+
5 rows in set (0.09 sec)

其中typeid为:

1 for shot
2 for save
3 for goal
4 for assist

我如何构建一个mysql查询,它给我一个看起来像这样的结果

+--------+------+------+-------+---------+----------------+
| Name   | Team | Shots| Saves | Goals   | Assists        |
+--------+------+------+-------+---------+----------------+
| Nick   |     1|     8|      0|        4|               1|
| Jeff   |     4|     5|      0|        5|               6|
| Jim    |     7|     7|      0|        6|               3|
+--------+------+------+-------+---------+----------------+

在第10个结果之后结束? (限10)

我一直在努力工作几个小时,我很想不起。我算什么?我分组了什么?我可以通过别名订购吗?


修改

我在第一次编辑时没有提到,虽然这个数据库中有18个有用的表,但它们都是空的(因此完全没用),因为它们与stat事件有关。

他们会非常有帮助。

但是,我必须仅使用typeid在这一个statevents表上构建我的查询。这可能吗?


2 个答案:

答案 0 :(得分:1)

基本上,您只是尝试构建一个简单的PIVOT TABLE查询。我个人主张只返回一个GROUPed结果集并在应用程序级别处理数据显示,但如果你必须在MySQL中进行数据透视,那么它可能看起来像这样 - 我已经改变了一些列/表名字让你思考一下......

 SELECT p.firstname
      , p.team_id 
      , COUNT(CASE WHEN event_type_id = 1 THEN 'foo' END) Shots
      , COUNT(CASE WHEN event_type_id = 2 THEN 'foo' END) Saves
      , COUNT(CASE WHEN event_type_id = 3 THEN 'foo' END) Goals
      , COUNT(CASE WHEN event_type_id = 4 THEN 'foo' END) Assists
   FROM player p 
   JOIN stat_event e 
     ON e.player_id = p.player_id
  GROUP
     BY p.player_id;

答案 1 :(得分:0)

您必须将玩家表与您需要的其他表格(镜头,保存,目标等)一起加入。

你有一个加入的地方,你需要在group by子句的帮助下聚合玩家ID,玩家名称和团队。

您的最终查询将如下所示..

SELECT p.firstname, t.team, COUNT(sh.shots), COUNT(sa.saves), COUNT(g.goals),COUNT(a.assists)
FROM   player p 
INNER  JOIN team t
ON     p.tid = t.tid
....
GROUP BY p.pid, p.firstname, t.team
LIMIT 10

编辑:

我不是数据库专家。我有一种 SUBOPTIMAL 方式来实现这一目标。

我会创建一个包含表单信息的临时表(它也必须包含pid和tid信息):

...
Nick Goals 13
Matt Saves 4
Nick Saves 11
...

这应该很容易实现。

然后我会使用SQL游标迭代所有不同的玩家ID并从我们上面构建的临时表中恢复统计数据。