我正在建立一个拥有这些牌桌的足球联赛数据库:
+---------------------+
| 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表上构建我的查询。这可能吗?
答案 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并从我们上面构建的临时表中恢复统计数据。