У меня есть таблица mysql, т.е.
st_id | имя | электронная почта | математика | химия | био | социальное исследование 1 | john |@a.com | 20 | 23 | 10 | 15
мой вопрос в том, как я могу найти самую высокую оценку предмета, вторую последнюю и так далее
Обратите внимание, что все поля subject имеют значения int (11)
Разбейте базу данных на 3 таблицы:
Студенты:
st_id | name | email 1 | john |@a.com
Курсы:
cr_id | name 1 | maths 2 | chemistry 3 | bio 4 | social_studies
StudentCourses:
st_id | cr_id | score 1 | 1 | 20 1 | 2 | 23 1 | 3 | 10 1 | 4 | 15
Теперь вы можете сделать:
SELECT s.name, MAX(sc.score) FROM Students s INNER JOIN StudentCourses sc ON s.st_id = sc.st_id;
SELECT * FROM <table> ORDER BY <field> DESC LIMIT <needed number of rows>
Пример:
SELECT * FROM <table> ORDER BY maths+chemistry+bio+social_study DESC LIMIT 3
Строго PHP-метод: я предполагаю, что вы хотите поддерживать связь с именами полей. В этом случае просто используйте asort($row);
в каждой строке результата запроса, предполагая, что вы выбрали строку как массив. asort
будет сортировать массив от наименьшего значения до самого высокого (с дополнительными флагами, чтобы при необходимости asort
результаты) при сохранении ключей. Затем цикл foreach
позволяет вам работать с каждой парой ключ / значение в отсортированном порядке.
st_id | name | email | maths | chemistry | bio | social_study 1 | john |@a.com | 20 | 23 | 10 | 15
Запрос может быть для верхних знаков
SELECT id,GREATEST(mark,mark1,mark2) AS `top` FROM `students`