1

我敢肯定这种问题之前已经出现过,但我一直在寻找,找不到与我需要的类似的东西。

编辑:所以经过一些阅读,这看起来像是属于枢轴并使用组连接。如果有人有任何见解,我真的很感激。

我有 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  

你不能把一行当作一列,想象一下约翰有 100000 次 test1,就不可能把它当作列。

于 2012-06-01T19:12:55.903 回答