Как получить максимальное и среднее значение поля из таблицы mysql с некоторыми условиями

#php #mysql

#php #mysql

Вопрос:

У меня есть таблица с записями, подобными следующим.

 
id     score      student_id      course_id
----   ------     ----------      ----------
1      12         1               1
2      10         2               1
3      20         3               1
4      35         1               2
5      50         5               1
6      70         1               3
7      25         3               2
8      30         2               2
9      25         3               3
  

В настоящее время я сначала выполняю этот запрос

 
SELECT id,
       score,
       student_id,
       course_id
FROM scores
WHERE student_id=1 

Вывод запроса

 
id  student_id   course_id  score 
--  ----------   ---------  -----
1   1            1          12    
4   1            2          35    
6   1            3          70
 

ЗАТЕМ запускаем ЦИКЛ ПО РЕЗУЛЬТАТУ И находим avg_score, max_score, ИСПОЛЬЗУЯ этот запрос

 SELECT AVG(score) AS avg_score,
         MAX(score) AS max_score
  FROM scores WHERE course_id = RESULT['course_id']
 

а затем добавить их в результат. Итак, наконец, я получаю результат с avg_score и max_score следующим образом

 
id  student_id   course_id  score  avg_score  max_score
--  ----------   ---------  -----  ---------  ---------
1   1            1          12     23         50
4   1            2          35     30         35
6   1            3          70     47.50      70
 

Я хочу знать, возможно ли получить результат с помощью одного запроса, а не так, как я делаю прямо сейчас.

Я пробовал этот запрос, но я получаю только 1 строку вместо 3. Также значения avg_score и max_score неверны.

 
SELECT Score.id, Score.student_id, Score.course_id, Score.score, ROUND(AVG(mScore.score),2) as avg_score, MAX(mScore.score) as max_score 
FROM `scores` AS `Score` 
LEFT JOIN `scores` as `mScore` ON mScore.course_id = Score.course_id 
WHERE Score.student_id = 1
 

Результат приведенного выше запроса

 
id  student_id   course_id  score  avg_score  max_score
--  ----------   ---------  -----  ---------  ---------
1   1            1          12     30.78      70
 

ссылка на sqlfiddle http://sqlfiddle.com /#!2/8a3f1f/8

Если это невозможно с помощью одного запроса, но есть лучшая альтернатива, чем то, что я делаю сейчас, пожалуйста, дайте мне знать.

PS: Вот ссылка jsfiddle на актуальную проблему. http://sqlfiddle.com /#!2/c50aa9/1/0 В нем есть две таблицы. Я упростил и объединил две таблицы в одну в вопросе. Единственный запрос, который я пытался, дает только одну строку, где он должен давать 4 строки, подобные этому запросу, без avg_score и max_score http://sqlfiddle.com /#!2/c50aa9/3/0

Комментарии:

1. Не могли бы вы, пожалуйста, предоставить sqlfiddle?

2. вот ссылка на sqlfiddle sqlfiddle.com /#!2/c50aa9/1/0 запрос выдает только одну строку, в которой есть 4 строки sqlfiddle.com /#!2/c50aa9/3/0

3. Я решил головоломку. Я был почти там. Следующий запрос решил мою проблему ВЫБЕРИТЕ Score.id , Score.student_id, Score.course_id, Score.score, ROUND(СРЕДНЕЕ значение (mScore.score), 2) как среднее значение, MAX(mScore.score) как максимальное значение ИЗ scores Score ЛЕВОГО СОЕДИНЕНИЯ scores , как mScore НА mScore.course_id = Score.course_id, ГДЕ Score.student_id = 1 ГРУППА ПО Score.id

Ответ №1:

 SELECT id, score, student_id, course_id,  
       AVG(score) as avg_score, 
       MAX(score) as max_score
FROM scores 
WHERE student_id = 1
group by id, score, student_id, course_id 
 

И если вы удалите where условие, то вы можете получить это для всех студентов сразу.

Комментарии:

1. Что означает $currentCourse ? На самом деле я имел в виду, что current course_id — это course_id каждой строки результата. Предположим, что для первой строки результата avg_score и max_score — это среднее / максимальное из всех баллов для course_id 1. Для второй строки это для course_id 2 .

2. Затем попробуйте этот модифицированный запрос.

3. модифицированный запрос не работает. он показывает оценку как avg_score и max_score. Проверьте свой запрос здесь sqlfiddle.com /#!2/8a3f1f/11

4. Кстати, я решил головоломку. Я был почти там. Следующий запрос решил мою проблему ВЫБЕРИТЕ Score.id , Score.student_id, Score.course_id, Score.score, ROUND (СРЕДНЕЕ значение (mScore.score), 2) как среднее значение, MAX (mScore.score) как максимальное значение ИЗ баллов, ПОСКОЛЬКУ оценка СЛЕВА ПРИСОЕДИНЯЕТСЯ к баллам как mScore НА mScore.course_id = Оценка.course_id ГДЕ Score.student_id = 1 ГРУППА ПО Score.id Спасибо за вашу помощь.

Ответ №2:

Следующий запрос решил головоломку.

 
SELECT Score.id, Score.student_id, Score.course_id, Score.score, ROUND(AVG(mScore.score),2) as avg_score, MAX(mScore.score) as max_score 
FROM `scores` AS `Score` 
LEFT JOIN `scores` as `mScore` ON mScore.course_id = Score.course_id 
WHERE Score.student_id = 1 GROUP BY Score.id
 

http://sqlfiddle.com /#!2/8a3f1f/10

Если все еще есть какое-либо лучшее решение, пожалуйста, дайте мне знать.