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