#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
Если все еще есть какое-либо лучшее решение, пожалуйста, дайте мне знать.