MySQL — Получить min, max и свойство строки, содержащей max

#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
  

Это просто идея, хотя я ее не тестировал. Прошу прощения за любые ошибки.