2016-10-01 4 views
0

Так что в основном у меня простая база данных с одной таблицей (это тестовая БД). В таблице 4 колонки:SQL непредвиденный возврат

  • ID
  • Имя
  • OralGrade
  • WrittenGrade

То, что я пытаюсь сделать, это довольно просто (вот почему я прошу ваша помощь): Я хочу получить имя и средний студент с самым высоким средним уровнем.

Что я пробовал:

SELECT nom, MAX(avg) 
    FROM ( 
     SELECT nom, (noteOrale + noteEcrit)/2 as avg 
     FROM etudiant 
     GROUP BY nom) AS Table; 

После попытки этого запроса, он вернулся мне имя и среднего но среднего не соответствует названию.

Может кто-нибудь дать мне указатели или объяснить, что пошло не так? Благодаря

ответ

2

Использование order by и limit. Нет подзапрос не обязательно:

SELECT nom, (noteOrale + noteEcrit)/2 as avg 
    FROM etudiant 
    ORDER BY avg DESC 
    LIMIT 1; 

Казалось бы, что ни GROUP BY не требуется либо, так как значения находятся на одной строке.

Если они несколько строк, то вам необходимо GROUP BY.

+0

Благодарим за помощь. Я поставил ваш ответ как правильный, поскольку он немного проще. –

1

я бы просто использовать limit для этого:

SELECT nom, avg 
FROM (
    SELECT nom, (noteOrale + noteEcrit)/2 as avg 
    FROM etudiant 
    GROUP BY nom 
) t 
ORDER BY avg DESC 
LIMIT 1 

mysql позволяет использовать агрегацию без учета всех необобщенных столбцов в предложении group by - так что ваш запрос просто возвращается произвольное значение имени ,

+0

Спасибо, оба ответа работают отлично :) Я буду отмечать ответ @Gordon Linoff как правильный, поскольку он проще. –

0

Неверно, что значение, возвращаемое для nom, равно неопределенным. Агрегат MAX() заставляет запрос сворачивать все строки и выбирает самое высокое значение avg. Эта часть работает.

Но возвращенное значение nom от некоторых строки в свернутом группе, не обязательно строка, которая имеет наибольшее значение avg. Запрос в основном сказал MySQL, чтобы вернуть значение nom от любой строки в группе.

Другие базы данных будут вызывать ошибку в запросе с сообщением об ошибке в строке «неагрегировать в списке SELECT, а не в GROUP BY».

Нестандартное расширение, зависящее от MySQL, позволяет выполнять запрос. (Возможно, MySQL лучше подходит к стандарту, как и к другой базе данных, если мы включим ONLY_FULL_GROUP_BY в sql_mode. С отключенным расширением MySQL будет вести себя как другие базы данных и возвращать ошибку.)

В этом причина «неожиданного» поведения, которое вы наблюдаете.

(Это ответ на вопрос, который вы просили ... объяснить, что пошло не так.)

-1

Просто список строк, где сумма двух полей равна higest сумме двух полей во всех строках. Вам не нужно делиться на две части. Это просто масштабирование.

Select * from table 
Where noteOrale + noteEcrit = 
    (Select Max(noteOrale + noteEcrit) 
    From table) 

Если вы также хотите, чтобы вычисленный avg на выходе, добавьте его в предложение select.

Select nom, noteOrale, noteEcrit, 
    (noteOrale + noteEcrit)/2 Avg 
from table 
Where noteOrale + noteEcrit = 
    (Select Max(noteOrale + noteEcrit) 
    From table) 
Смежные вопросы