2013-01-31 107 views
1

每个学生都有一些分数(每个分数有student_id列)。计算平均值较大的行

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

是否有可能根据他的平均查询位置和1查询? (5月包含子查询或连接)

我可以通过这个查询所有学生通过他们的平均排序:

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的功能是更好的,在这种情况下)

回答

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

希望这有助于

+0

谢谢,但通过他们的平均学生进行排序。我之前已经明白了...(再次阅读我的问题),我想找到1个学生的位置。 (例如,他的统计编号是“100”) – mrdaliri

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查询

+0

谢谢,但我想找到学生的位置。不是班上第三个学生。 (在你的查询结束时,你有'WHERE rank = 3') – mrdaliri

+0

为了方便,我添加了“rank = 3”,你甚至可以在他们的队伍中搜索....否则你打印完整的表格...... – Wazzzy

+0

是的,但我不需要完整的桌子或第三个学生。我想在他的班级中学生数量为100的学生。 – mrdaliri

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.

根据你所追求的位置,你可能想要删除分销商NCT条款。

请参阅this fiddle

+0

@kikio不正确吗?我正在返回给定学生的位置......目前尚不清楚你是否在寻找这个,或者你是否需要对学生进行排名(如波希米亚人的回答) – fthiella

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 
+0

什么是'x'?它也返回语法错误。 – mrdaliri

+0

x是嵌套查询所需的别名(它可以是任何内容,但它必须是某种东西。我发现语法错误 - 我忘了mysql对'SELECT'列表中'*'的位置敏感:它必须是第一个。我编辑了查询,现在应该可以工作 – Bohemian