1

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

+---------------------+
| 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 个有用的表,但它们都是空的(因此完全没用),因为它们与统计事件有关。

他们会非常有帮助。

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


4

2 回答 2

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;
于 2013-05-02T23:02:00.657 回答
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

编辑:

我不是数据库专家。我有一种实现这一目标的次方法。

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

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

这应该很容易实现。

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

于 2013-05-02T08:05:17.743 回答