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分钟。