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

Mysql 查询统计数据库以获取不同事件的计数,mysql,count,group-by,Mysql,Count,Group By,我正在制作一个足球联赛数据库,其中包含以下表格: +---------------------+ | Tables_in_league484 | +---------------------+ | player | | statevent | +---------------------+ 18 rows in set (0.09 sec) 问题中的玩家表如下所示 mysql> desc player; +-----------+------

我正在制作一个足球联赛数据库,其中包含以下表格:

+---------------------+
| 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表上构造查询。这可能吗



您必须将玩家表与其他需要计数的表(投篮、扑救、进球等)连接起来

一旦加入到位,就需要在GROUPBY子句的帮助下聚合球员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
编辑:

我不是数据库专家。我有一个次优的方法来实现这一点

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

这应该很容易实现


然后,我将使用SQL游标迭代所有不同的玩家ID,并从上面构造的临时表中恢复统计信息。

您必须将玩家表与需要计数的其他表(投篮、扑救、进球等)连接起来

一旦加入到位,就需要在GROUPBY子句的帮助下聚合球员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
编辑:

我不是数据库专家。我有一个次优的方法来实现这一点

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

这应该很容易实现


然后,我将使用SQL游标迭代所有不同的播放器ID,并从上面构造的临时表中恢复统计信息。

本质上,您只是试图构造一个简单的透视表查询。就我个人而言,我主张只返回一个分组结果集并在应用程序级别处理数据显示,但是如果您必须在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;

实际上,您只是试图构造一个简单的透视表查询。就我个人而言,我主张只返回一个分组结果集并在应用程序级别处理数据显示,但是如果您必须在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;

乍一看,如果这些表有数据,这应该是正确的答案和正确的方法。不幸的是,它们是空的,我必须单独使用typeid。我编辑了这篇评论,以反映这一令人悲伤的信息。这可能吗?乍一看,这应该是正确的答案,如果这些表有数据的话,这应该是正确的方法。不幸的是,它们是空的,我必须单独使用typeid。我编辑了这篇评论,以反映这一令人悲伤的信息。这可能吗?gid是游戏表的fk,它存储gid、homeid、awayid、homescore、awayscore、field和dateOK。有中转窗口吗?如果比赛发生在停站时间的第91分钟或加时赛的第一分钟,会有什么区别吗?非常简单:没有交易/转移,时间从0-90(也没有加时赛)。开始(typeid=0)在各自游戏的0分钟内全部发生。gid是游戏表的fk,其中存储gid、homeid、awayid、homescore、awayscore、field和dateOK。有中转窗口吗?如果比赛发生在停站时间的第91分钟或加时赛的第一分钟,会有什么区别吗?非常简单:没有交易/转移,时间从0-90(也没有加时赛)。开始(typeid=0)发生在各自比赛的第0分钟。