1

每个学生都有一些分数(每个分数都有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

但它需要用PHParray_search函数处理。(我认为在这种情况下使用 MySQL 函数更好)

4

4 回答 4

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

可以解决您的问题
检查此链接

感谢 Meherzad 的 sql 查询

于 2013-01-31T12:37:16.123 回答
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

希望这可以帮助

于 2013-01-31T12:32:04.283 回答
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
于 2013-01-31T14:05:54.977 回答
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 子句。

看到这个小提琴

于 2013-01-31T13:12:03.173 回答