2013-06-20 2 views
1

У меня есть две таблиц:Присвоить псевдоним таблицы в подзапросе MySQL

  1. exam таблица, которая содержит оценку, выполняемые студентами
  2. и стол студента

Оба соединены таким образом, : student.id = exam.student_id.

Я пытаюсь получить firt пяти студентов, которые имеют самый высокий балл, рассчитанный в среднем на их счет в течение 5 дней, используя приведенный ниже запрос:

SELECT 
    student.id as std_id, 
    student.name, 
    (SELECT AVG(score) FROM exam WHERE exam.student_id=std_id ORDER BY exam.timestamp DESC LIMIT 5) AS score 

FROM student 
ORDER BY score 
DESC LIMIT 5 

Я имею следующую ошибку:

#1054 - Unknown column 'std_id' in 'where clause' 

Я также попробовал это, заменив std_id на student.id, но все равно не повезло.

Любая идея, как решить эту проблему? Большое спасибо

------------------------------------------------------------------------------ 

Извините, я допустил ошибку в своей логике. Как было сказано ранее, в среднем рассчитан на

only the last 5 scores recorded

. Обновленный запрос:

SELECT 
    student.id as std_id, 
    student.name, 
    (SELECT AVG(score) FROM (SELECT score FROM exam WHERE exam.student_id=student.id ORDER BY exam.timestamp DESC LIMIT 5) AS score) AS score 
FROM student 
ORDER BY score 
DESC LIMIT 5 

Место, которое дает ошибку, где я поставил exam.student_id = student.id

Спасибо.

+0

Можете ли вы опубликовать определения таблиц и несколько примеров данных? – Kickstart

ответ

1

Просто замените std_id на student.id - псевдоним еще не существует во время компиляции подзапросов, так как внешний запрос не может быть скомпилирован до тех пор, пока подзапрос не будет считаться действительным (и его выход известен).

+0

Спасибо, но я уже пробовал это, но получил сообщение об ошибке # 1054 - Неизвестный столбец 'student.id' in 'where clause' – Lomse

+0

[У вас есть еще одна проблема] (http://sqlfiddle.com/#!2/7369b/2). –

+0

Вы, ребята, правы и сожалеете, что я ошибся в своей логике. Я только что обновил свой вопрос. Спасибо – Lomse

1

Ваш код выглядит так, как будто он должен работать для меня (по крайней мере, когда был предложен мотив, предложенный Нильсом Кёрентьесом).

Возможно, вы можете использовать сгенерированную последовательность, а не коррелированный подвыбор. Что-то вроде thi: -

SELECT 
    student.id, 
    student.name, 
    AVG(Sub3.score) 
FROM student 
LEFT OUTER JOIN (
    SELECT Sub1.student_id, Sub1.score, @aSeq := IF(@PrevStudent = student_id, @aSeq + 1, 0) AS Sequence, @PrevStudent := student_id 
    FROM (SELECT * FROM exam ORDER BY student_id, timestamp DESC) Sub1 
    CROSS JOIN (SELECT @PrevStudent := 0, @aSeq := 0) Sub2 
) Sub3 
ON student.id = Sub3.student_id 
WHERE (Sub3.Sequence IS NULL OR Sub3.Sequence < 5) 
GROUP BY student.id, student.name 
+0

Вы, ребята, правы и сожалеете, что я ошибся в своей логике. Я только что обновил свой вопрос. благодаря – Lomse

Смежные вопросы