Страницы

Поиск по вопросам

пятница, 14 декабря 2018 г.

“Задачка” на составление SQL-запроса

Есть запрос:
SELECT *, DATE_FORMAT(`timestamp`,'%d.%m.%Y') AS `date` FROM testresults WHERE `timestamp` > '2011-08-01' AND `timestamp` NOT LIKE ('2011-08-04%') AND `publish` = '1' ORDER BY SUBSTRING(`timestamp`, 1, 10) DESC, `green` DESC, `red` ASC, `white` ASC, `timestamp` DESC
Запрос вытаскивает записи результатов тестов за текущий месяц и сортирует их по дням таким образом, чтобы тесты с лучшими результатами "внутри" дня шли первыми. Но мне, на самом деле, нужно выбрать только первую строчку "внутри" каждого дня, т.е. только одну строчку с самым лучшим результатом за каждый день текущего месяца. Можно ли это сделать в данном запросе? И если можно, то каким образом нужно модифицировать запрос?
upd: Результат теста лежит в трех колонках: green (количество правильных ответов), red (количество неправильных) и white (количество вопросов без ответа). Если количество green, red и white у двух тестов одинаковое, то лучшим из них (в этот день) считается тот, который сделан позже по времени (поле timestamp, формат этого поля YYYY-MM-DD HH:MM:SS). В ORDER BY видно как сортируются результаты.
Если бы поле в котором лежит результат было бы одно, то можно было бы сделать MAX() по этому полю, сгруппировав записи по дням. Но здесь фактически четыре поля определяющих лучший результат и я не вижу варианта как можно по ним сделать МАX() или что-то подобное ...
т.е. по сути надо сделать что-то типа "LIMIT 1 внутри каждого дня" ... вот только как и можно ли это сделать вообще?


Ответ

К сожалению, в mysql нет аналитических функций, поэтому придёться немного поизвращаться. Примерно так. select * from testresults t, (select max(a.id) as id from testresults a, (select max(result) res, date(day) d from testresults group by date(day)) b where a.result = b.res and date(a.day) = b.d group by a.result, date(a.day)) x where t.id = x.id; Хороший, кстати, вопрос) Тут таких мало.

Комментариев нет:

Отправить комментарий