2013-01-31 105 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