我有一张包含以下记录的表格。
id score student_id course_id
---- ------ ---------- ----------
1 12 1 1
2 10 2 1
3 20 3 1
4 35 1 2
5 50 5 1
6 70 1 3
7 25 3 2
8 30 2 2
9 25 3 3
目前我首先运行此查询
SELECT id,
score,
student_id,
course_id
FROM scores
WHERE student_id=1
查询的输出是
id student_id course_id score
-- ---------- --------- -----
1 1 1 12
4 1 2 35
6 1 3 70
然后运行LOOP ON RESULT并找到avg_score,max_score使用此查询
SELECT AVG(score) AS avg_score,
MAX(score) AS max_score
FROM scores WHERE course_id = RESULT['course_id']
然后在结果中添加它们。所以最后我得到了avg_score和max_score这样的结果
id student_id course_id score avg_score max_score
-- ---------- --------- ----- --------- ---------
1 1 1 12 23 50
4 1 2 35 30 35
6 1 3 70 47.50 70
我想知道是否可以使用单个查询来获取结果,而不是像我现在所做的那样。
我试过这个查询,但我只得到1行而不是3.而且avg_score和max_score也是错误的。
SELECT Score.id, Score.student_id, Score.course_id, Score.score, ROUND(AVG(mScore.score),2) as avg_score, MAX(mScore.score) as max_score
FROM `scores` AS `Score`
LEFT JOIN `scores` as `mScore` ON mScore.course_id = Score.course_id
WHERE Score.student_id = 1
上述查询的输出是
id student_id course_id score avg_score max_score
-- ---------- --------- ----- --------- ---------
1 1 1 12 30.78 70
sqlfiddle链接是http://sqlfiddle.com/#!2/8a3f1f/8
如果使用单一查询无法实现,但有比现在更好的选择,请告诉我。
PS:这是实际问题的jsfiddle链接。 http://sqlfiddle.com/#!2/c50aa9/1/0 它有两个表。我简化并将两个表合并为一个问题。 我尝试的单个查询只给出了一行,它应该像没有avg_score和max_score http://sqlfiddle.com/#!2/c50aa9/3/0
这样的查询给出4行答案 0 :(得分:1)
SELECT id, score, student_id, course_id,
AVG(score) as avg_score,
MAX(score) as max_score
FROM scores
WHERE student_id = 1
group by id, score, student_id, course_id
如果您删除了where
条件,那么您可以立即为所有学生提供此条件。
答案 1 :(得分:0)
以下查询解决了这个难题。
SELECT Score.id, Score.student_id, Score.course_id, Score.score, ROUND(AVG(mScore.score),2) as avg_score, MAX(mScore.score) as max_score
FROM `scores` AS `Score`
LEFT JOIN `scores` as `mScore` ON mScore.course_id = Score.course_id
WHERE Score.student_id = 1 GROUP BY Score.id
http://sqlfiddle.com/#!2/8a3f1f/10
如果还有更好的解决方案,请告诉我。