#mysql #grails
#mysql #grails
Вопрос:
Мне нужно получить три поля из таблицы. В таблице есть поля — id, timestamp, viewTime. Мне нужно получить min (временную метку), max (временную метку), время просмотра записи с max (временной меткой). Я бы предпочел иметь только один запрос.
SELECT MAX(timestamp),
MIN(timestamp),
viewTime
FROM session_progress
WHERE session_id = 2374;
Этот запрос возвращает min, max правильно, но возвращает минимальное время просмотра. Что я действительно хочу, так это время просмотра записи, которая имеет максимальную временную метку.
Пример:
timestamp viewTime
----------------------------------
2011-11-05 10:21:00 1055
2011-11-06 15:00:00 8900
2011-11-07 18:20:00 750
2011-11-07 19:23:00 4200
Запрос возвращает время просмотра 750, но мне нужно максимальное время просмотра, которое равно 4200.
Если ответ написан в grails, еще лучше (это то же самое, что и в приведенном выше SQL-запросе):
def sp_res = sp.get {
projections {
min("timestamp")
max("timestamp")
totalTime
}
and {
eq("sessionId", unSession.id)
}
}
Комментарии:
1. Этот запрос не имеет смысла. Только неаккуратный MySQL допускает такой синтаксис (который не имеет смысла). Реальные базы данных будут жаловаться (например, SQL Server скажет что-то вроде: »
Column 'session_progress.viewTime' is invalid in the select list because it is not contained in either an aggregate function or the GROUP BY clause.
«)2. что вы имеете в виду? Должен ли я использовать 2 запроса? Сначала получить строки, затем поле строки? Спасибо.
Ответ №1:
select b.maxT, b.minT, viewTime
from session_progress,
(select max(timestamp) as maxT, min(timestamp) as minT
from session_progress
where session_id=2374 ) b
where where session_id=2374 AND timestamp = b.maxT
Это просто идея, хотя я ее не тестировал. Прошу прощения за любые ошибки.