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 のみを使用して、statevent のこの 1 つのテーブルでクエリを構成する必要があります。これは可能ですか?


4

2 に答える 2

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

編集:

私はDBの専門家ではありません。これを達成するためのサブオプティマルな方法が 1 つあります。

フォームの情報を含む一時テーブルを作成します (pid と tid の情報も含める必要があります)。

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

これは簡単に達成できるはずです。

次に、SQL カーソルを使用してすべての個別のプレイヤー ID を反復処理し、上で作成した一時テーブルから統計を復元します。

于 2013-05-02T08:05:17.743 に答える