Есть запрос:
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; Хороший, кстати, вопрос) Тут таких мало.
Комментариев нет:
Отправить комментарий