73 / 73 / 23
Регистрация: 07.11.2013
Сообщений: 539
1

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

19.11.2016, 21:58. Показов 2813. Ответов 4
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Да, может заголовок не очень, но я не знаю как лучше вкратце описать проблему.
В общем, у меня есть результаты тестирования, которые состоят из даты и собственно результата, задача: получить для каждого пользователя 5 последних результатов и отсортировать это всё по последнему результату.
С первым пунктом я справился:
SQL
1
2
3
4
5
6
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;
А вот со вторым пунктом проблемы.. Я сначала думал отсортировать так:
SQL
1
ORDER BY SUM(IF(r.date=MAX(r.date), r.bal, 0));
Но, увы, нельзя использовать MAX внутри SUM. А так бы всё сработало, ну что за несправедливость =)

Так что я уже не знаю, как реализовать сортировку не находя ещё одним запросом нужный балл, а это не вариант, так как придётся туда так же прописывать WHERE и следовательно все JOIN'ы
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
19.11.2016, 21:58
Ответы с готовыми решениями:

Залить ячейки находящиеся на одной стороке с одинаковым текстом в другой ячейки находящейся в этой же строке
Здравствуйте. Вопрос от непонимающего. Как Залить ячейки находящиеся на одной стороке с одинаковым...

Как задать значение для ячейки в зависимости от значения другой ячейки
Здравствуйте! Подскажите, как задать значение для ячейки в зависимости от значения другой ячейки....

Значение ячейки в зависимости от значения другой ячейки
Уважаемые форумчане, очень нужна ваша помощь. тем полно перерыла, но т.к. знаний в этой области...

Значение ячейки в зависимости от значения другой ячейки
Добрый день! Есть собственно вот такая задача: есть ячейка с цыфровым значением (предположим...

4
411 / 365 / 142
Регистрация: 09.04.2011
Сообщений: 1,050
20.11.2016, 02:50 2
в части select добавьте ещё определение последнего результата и по нему сортируйте
0
73 / 73 / 23
Регистрация: 07.11.2013
Сообщений: 539
20.11.2016, 13:32  [ТС] 3
retvizan, Если добавить это
SQL
1
SUM(IF(r.DATE=MAX(r.DATE), r.bal, 0))
в SELECT, запрос всё так же не будет выполнятся (с той же ошибкой: Invalid use of group function).

Я даже пробовал в SELECT добавить это
SQL
1
MAX(r.DATE) AS 'maxDate'
И потом в ORDER BY это
SQL
1
ORDER BY SUM(IF(r.DATE=maxDate, r.bal, 0));
Но, хотя в самом ORDER BY можно использовать алиасы, внутри SUM функцию MAX всё так же использовать нельзя (даже по псевдониму), ошибка: Reference 'maxDate' not supported (reference to group function)
0
411 / 365 / 142
Регистрация: 09.04.2011
Сообщений: 1,050
20.11.2016, 14:23 4
Лучший ответ Сообщение было отмечено maxkoshevoi как решение

Решение

maxkoshevoi,
MySQL
1
2
3
4
5
6
7
8
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
73 / 73 / 23
Регистрация: 07.11.2013
Сообщений: 539
20.11.2016, 18:16  [ТС] 5
retvizan, это гениально!!!
Только один маленький недочёт. Оно сортирует как строку, но это легко исправить добавив CAST(... AS DECIMAL)
Итоговый запрос:
SQL
1
2
3
4
5
6
7
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 CAST(SUBSTRING_INDEX(GROUP_CONCAT(r.bal ORDER BY r.DATE DESC SEPARATOR ','), ',', 1) AS DECIMAL) DESC;
Правду говорят, всё гениальное - просто, огромное спасибо =)

Добавлено через 7 минут
ПС: Запрос, который я до этого написал через self join, ищет только последний результат (а не, например, 5 последних) и работает в 2 раза дольше

Добавлено через 3 часа 35 минут
Заметил ещё одну ошибку. Если последний результат - null (такой тоже может быть), но GROUP_CONCAT его проигнорирует и получается для этого пользователя в сортировке будет учитываться уже предпоследний результат. Так что я ещё немного подправил ORDER BY, чтобы в любом случае сортировка шла по последнему результату:
SQL
1
ORDER BY CAST(NULLIF(SUBSTRING_INDEX(GROUP_CONCAT(IFNULL(r.bal, '-') ORDER BY r.DATE DESC SEPARATOR ','), ',', 1), '-') AS DECIMAL) DESC;
0
20.11.2016, 18:16
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
20.11.2016, 18:16
Помогаю со студенческими работами здесь

Получить значение ячейки в выбранной строке datagrid
Здравствуйте) Подскажите, пожалуйста, можно ли как-нибудь расчленить полученную коллекцию...

Получить значение ячейки из таблицы и присвоить это значение в другую
Привет всем. Мне необходимо получить значение ячейки из таблицы и присвоить это значение в другую. ...

Проверить ячейки в столбце на какое-либо значение, не зная их количества
как проверить ячейки в столбце на какое либо значение, не зная какое количество ячеек заполнено в...

Если в диапазоне ячеек есть СЕГОДНЯ, то взять значение слева от этой ячейки
Был бы очень благодарен помощи в подборе нужной формулы. Нужно, чтобы в отдельно стоящую...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2023, CyberForum.ru