我确信此类问题已经提出,但我一直在搜索,找不到与我需要的相似的东西。
编辑:所以经过一些阅读后,这看起来像是在枢轴下并使用群组连接。如果有人有任何见解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逻辑来完成这项工作,但我想获得最有效的解决方案。非常感谢任何帮助。
答案 0 :(得分: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 |
+------+---------+-------+-------+
编辑:您无法根据测试表的内容动态生成测试列。您可以选择要用作列的特定值。
答案 1 :(得分:0)
您需要查看AVG功能。
答案 2 :(得分: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
你不能把一行作为一列,假设John有100000倍的test1,就不可能将它作为列。