Получить значение ячейки, зная, что у другой ячейки в этой строке - максимальное значение - MySQL
Формулировка задачи:
Да, может заголовок не очень, но я не знаю как лучше вкратце описать проблему.
В общем, у меня есть результаты тестирования, которые состоят из даты и собственно результата, задача: получить для каждого пользователя 5 последних результатов и отсортировать это всё по последнему результату.
С первым пунктом я справился:
А вот со вторым пунктом проблемы.. Я сначала думал отсортировать так:
Но, увы, нельзя использовать MAX внутри SUM. А так бы всё сработало, ну что за несправедливость =)
Так что я уже не знаю, как реализовать сортировку не находя ещё одним запросом нужный балл, а это не вариант, так как придётся туда так же прописывать WHERE и следовательно все JOIN'ы
SELECT CONCAT(u.user_lname, ' ', u.user_fname) AS 'Пользователь', SUBSTRING_INDEX(GROUP_CONCAT(ROUND(r.bal) ORDER BY r.date DESC SEPARATOR ', '), ', ', 5) AS 'Последние результаты' FROM reports r JOIN users u ON r.user_id = u.id WHERE r.test_id = 6 GROUP BY r.user_id;
ORDER BY SUM(IF(r.date=MAX(r.date), r.bal, 0));
Решение задачи: «Получить значение ячейки, зная, что у другой ячейки в этой строке - максимальное значение»
textual
Листинг программы
SELECT CONCAT(u.user_lname, ' ', u.user_fname) AS 'Пользователь', SUBSTRING_INDEX(GROUP_CONCAT(ROUND(r.bal) ORDER BY r.DATE DESC SEPARATOR ', '), ', ', 5) AS 'Последние результаты', SUBSTRING_INDEX(GROUP_CONCAT(r.bal ORDER BY r.DATE DESC SEPARATOR ', '), ', ', 1) AS 'Последний результат' FROM reports r JOIN users u ON r.user_id = u.id WHERE r.test_id = 6 GROUP BY r.user_id order by 3;
Объяснение кода листинга программы
- В этом коде используется оператор SELECT для выбора данных из базы данных.
- Используется функция CONCAT для объединения двух строк в одну. В данном случае, это объединение фамилии и имени пользователя.
- Используется функция SUBSTRING_INDEX для разделения строки на части по определенному разделителю (в данном случае запятая и пробел).
- Используется функция GROUP_CONCAT для объединения значений из нескольких строк в одну строку, разделенную запятыми.
- Используется функция ROUND для округления числовых значений до определенного количества знаков после запятой.
- В условии WHERE указывается, что выбираются только те строки, где test_id равен 6.
- В условии JOIN указывается, что выбираются строки из таблицы reports и таблицы users, где значения в столбце user_id совпадают.
- Используется функция ORDER BY для сортировки результатов по столбцу с названием
Последний результат
. - Код выводит несколько столбцов:
Пользователь
,Последние результаты
иПоследний результат
. - Значение в столбце
Последние результаты
представляет собой строку, разделенную запятыми, содержащую последние результаты тестов для каждого пользователя. - Значение в столбце
Последний результат
представляет собой первый (последний) результат теста для каждого пользователя. - Код выводит только 5 последних результатов для каждого пользователя.
- Если количество результатов тестов для пользователя меньше 5, то будут выведены все имеющиеся результаты.
- Код выводит результаты в порядке убывания даты.
- Если у пользователя нет результатов тестов, то соответствующее значение в столбце
Последние результаты
будет пустой строкой. - Если у пользователя нет результатов тестов, то соответствующее значение в столбце
Последний результат
будет NULL. - Значения в столбцах
Пользователь
,Последние результаты
иПоследний результат
выводятся в порядке убывания даты. - Если у пользователя есть несколько результатов тестов с одинаковой датой, то они будут выведены в алфавитном порядке.
- Если у пользователя есть несколько результатов тестов с одинаковой датой и значением баланса, то они будут выведены в порядке возрастания id пользователя.
- Код не выводит значения в столбцах
user_lname
,user_fname
иbal
, так как они используются только для объединения и сортировки данных.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д