1

この種の質問は以前に出てきたと思いますが、私は検索していて、必要なものに似たものを見つけることができません。

編集:それで、いくつか読んだ後、これはピボットに分類され、グループ連結を使用しているように見えます。誰かが洞察IDを持っているなら、本当に感謝しています。

私は3つのテーブルを持っています(簡単にするために不要なフィールドとデータは削除されています):

Students
id       name
------------------
1        John
2        Jane



Tests
id     name
------------------
1      Test1
2      Test2



Results
id    test_id     student_id   result
--------------------------------------
1     1           1            90
2     1           2            70
3     2           1            50
4     2           2            95

私が欲しいのは、次のようなテーブルを作成できるようにすることです。

Name     Average    Test1    Test2
-----------------------------------
John     70         90        50
Jane     92.5       70        95

私は平均を取得する方法を知っており、醜いループとphpロジックのセットでこれを実行できると確信していますが、最も効率的なソリューションを取得したいと思います。どんな助けでも大歓迎です。

4

3 に答える 3

2
SELECT
    s.name,
    avg(r.result) AS average,
    t1.result AS test1,
    t2.result AS test2
FROM
    students s,
    results r,
    results t1,
    results t2
WHERE
    r.student_id = s.id AND
    t1.test_id = 1 AND
    t1.student_id = s.id AND
    t2.test_id = 2 AND
    t2.student_id = s.id
GROUP BY s.id;

+------+---------+-------+-------+
| name | average | test1 | test2 |
+------+---------+-------+-------+
| John |      70 |    90 |    50 | 
| Jane |    82.5 |    70 |    95 | 
+------+---------+-------+-------+

編集:テストテーブルの内容に基づいてテスト列を動的に作成することはできません。ただし、列として使用する特定の値を選択できます。

于 2012-06-02T01:15:19.217 に答える
0

AVG関数を確認する必要があります。

于 2012-06-01T19:12:38.497 に答える
0

これを試して:

mysql> Select s.Name as Name, avg(r.result) as Average 
from result as r join Student as s 
on r.id=s.id group by (r.id)

あなたはこのようなものを持つでしょう:

Name     Average 
-----------------
John     70    
Jane     92.5  

行を列として配置することはできません。ジョンがtest1の100000倍を持っていると想像してください。これは、列として配置することはできません。

于 2012-06-01T19:12:55.903 に答える