如何在某些条件下从mysql表中获取字段的最大值和平均值

时间:2014-06-23 11:05:42

标签: php mysql

我有一张包含以下记录的表格。


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行

2 个答案:

答案 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

如果还有更好的解决方案,请告诉我。