【问题标题】:Count rows with bigger average计算平均值较大的行
【发布时间】:2013-01-31 12:21:50
【问题描述】:

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

【问题讨论】:

    标签: mysql sorting average


    【解决方案1】:
    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 个学生职位。 (例如 hist id 为100
    【解决方案2】:
        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 查询

    【讨论】:

    • 谢谢,但我想找学生职位。不是班上第三的学生。 (在查询结束时,您有 WHERE rank = 3
    • 我添加了rank=3 方便您甚至可以在他们的队伍中搜索...。否则您打印完整的表格......
    • 是的,但我不需要完整的表格或第三个学生。我想要他班上 100 号学生的位置。
    【解决方案3】:

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

    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

    【讨论】:

    • @kikio 是不是正确的?我正在返回给定学生的位置......目前尚不清楚您是否正在寻找这个,或者您是否需要对学生进行排名(如 Bohemian 的回答)
    【解决方案4】:

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

    试试这个:

    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
    

    【讨论】:

    • x 是嵌套查询所需的别名(它可以是任何东西,但它必须是某种东西。我发现语法错误 - 我忘记了 mysql 对*SELECT list: 必须是第一个。我已经编辑了查询,现在应该可以使用了
    猜你喜欢
    • 2011-05-17
    • 1970-01-01
    • 2019-04-03
    • 1970-01-01
    • 1970-01-01
    • 2021-12-07
    • 2021-05-18
    • 1970-01-01
    • 2013-01-14
    相关资源
    最近更新 更多