Получить значение ячейки, зная, что у другой ячейки в этой строке - максимальное значение - MySQL

Узнай цену своей работы

Формулировка задачи:

Да, может заголовок не очень, но я не знаю как лучше вкратце описать проблему. В общем, у меня есть результаты тестирования, которые состоят из даты и собственно результата, задача: получить для каждого пользователя 5 последних результатов и отсортировать это всё по последнему результату. С первым пунктом я справился:
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));
Но, увы, нельзя использовать MAX внутри SUM. А так бы всё сработало, ну что за несправедливость =) Так что я уже не знаю, как реализовать сортировку не находя ещё одним запросом нужный балл, а это не вариант, так как придётся туда так же прописывать WHERE и следовательно все JOIN'ы

Решение задачи: «Получить значение ячейки, зная, что у другой ячейки в этой строке - максимальное значение»

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;

Объяснение кода листинга программы

  1. В этом коде используется оператор SELECT для выбора данных из базы данных.
  2. Используется функция CONCAT для объединения двух строк в одну. В данном случае, это объединение фамилии и имени пользователя.
  3. Используется функция SUBSTRING_INDEX для разделения строки на части по определенному разделителю (в данном случае запятая и пробел).
  4. Используется функция GROUP_CONCAT для объединения значений из нескольких строк в одну строку, разделенную запятыми.
  5. Используется функция ROUND для округления числовых значений до определенного количества знаков после запятой.
  6. В условии WHERE указывается, что выбираются только те строки, где test_id равен 6.
  7. В условии JOIN указывается, что выбираются строки из таблицы reports и таблицы users, где значения в столбце user_id совпадают.
  8. Используется функция ORDER BY для сортировки результатов по столбцу с названием Последний результат.
  9. Код выводит несколько столбцов: Пользователь, Последние результаты и Последний результат.
  10. Значение в столбце Последние результаты представляет собой строку, разделенную запятыми, содержащую последние результаты тестов для каждого пользователя.
  11. Значение в столбце Последний результат представляет собой первый (последний) результат теста для каждого пользователя.
  12. Код выводит только 5 последних результатов для каждого пользователя.
  13. Если количество результатов тестов для пользователя меньше 5, то будут выведены все имеющиеся результаты.
  14. Код выводит результаты в порядке убывания даты.
  15. Если у пользователя нет результатов тестов, то соответствующее значение в столбце Последние результаты будет пустой строкой.
  16. Если у пользователя нет результатов тестов, то соответствующее значение в столбце Последний результат будет NULL.
  17. Значения в столбцах Пользователь, Последние результаты и Последний результат выводятся в порядке убывания даты.
  18. Если у пользователя есть несколько результатов тестов с одинаковой датой, то они будут выведены в алфавитном порядке.
  19. Если у пользователя есть несколько результатов тестов с одинаковой датой и значением баланса, то они будут выведены в порядке возрастания id пользователя.
  20. Код не выводит значения в столбцах user_lname, user_fname и bal, так как они используются только для объединения и сортировки данных.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

7   голосов , оценка 3.429 из 5
Похожие ответы