计算平均值较大的行数

时间:2013-01-31 12:21:50

标签: mysql sorting average

每个学生都有一些分数(每个分数都有student_id列。)

我想计算学生的平均水平,将他的平均水平与其他学生进行比较,并找到他在班上的位置。

是否有可能根据他的1次查询的平均值找到他的位置? (可能包含子查询或联接)

我可以通过此查询按平均排序所有学生:

SELECT s.*
FROM
  scores s LEFT JOIN lessons lesson
  ON lesson.id = s.lesson_id
WHERE lesson.display = 1
GROUP BY s.student_id
ORDER BY AVG(s.score) DESC

但需要使用PHP array_search函数进行处理。 (在这种情况下,我认为使用MySQL函数更好)

4 个答案:

答案 0 :(得分:0)

select student_id, AVG(scores) as 'average' from lessons as l, scores as s 
where lessons.id = s.lesson_id and lesson.display = 1 
GROUP BY s.student_id order by average desc`

尝试此查询

示例http://sqlfiddle.com/#!2/4fb8d/1

希望这有帮助

答案 1 :(得分:0)

    select s.id, AVG(l.scores) as average from lessons as l, student as s 
    where l.id = s.lessonid and l.display = 1 
    GROUP BY s.id order by average desc

可以解决您的问题 请检查此link

感谢Meherzad的SQL查询

答案 2 :(得分:0)

我认为你正在寻找这样的东西:

SELECT COUNT(DISTINCT average)
FROM (
  SELECT AVG(score) as average
  FROM scores INNER JOIN lessons
       ON scores.lesson_id = lessons.id
  WHERE display=1
  GROUP BY student_id
  ) sub_scores
WHERE average >= (SELECT AVG(score)
                  FROM scores INNER JOIN lessons
                       ON scores.lesson_id = lessons.id
                  WHERE display=1
                        AND student_id=1)

在子查询sub_scores中,我正在计算所有学生的所有平均值,在外部查询中,我正在计算的平均数大于学生1的平均数。

这将返回学生1的位置。

根据您的目标,您可能希望删除DISTINCT子句。

请参阅this fiddle

答案 3 :(得分:0)

您需要在结果集上使用用户定义的变量。

试试这个:

SELECT *, (@rank := if(@rank is null, 1, @rank + 1)) as rank
FROM (SELECT s.*
  FROM scores s 
  LEFT JOIN lessons lesson ON lesson.id = s.lesson_id
  WHERE lesson.display = 1
  GROUP BY s.student_id 
  ORDER BY AVG(s.score) DESC
) x