Сортировать данные перед использованием GROUP BY? - PullRequest
2 голосов
/ 07 ноября 2011

Я прочитал, что группировка происходит перед заказом, есть ли способ, которым я могу заказать сначала, прежде чем группировать, не оборачивая весь мой запрос другим запросом, просто чтобы сделать это?:

id  | user_id | date_recorded
1   | 1       | 2011-11-07
2   | 1       | 2011-11-05    
3   | 1       | 2011-11-06
4   | 2       | 2011-11-03
5   | 2       | 2011-11-06

Обычно я должен выполнить этот запрос, чтобы получить желаемое:

SELECT
*
FROM (
    SELECT * FROM table ORDER BY date_recorded DESC
) t1
GROUP BY t1.user_id

Но мне интересно, есть ли лучшее решение.*

Ответы [ 2 ]

1 голос
/ 07 ноября 2011

Ваш вопрос несколько неясен, но у меня есть подозрение, что вы действительно хотите, чтобы это были не какие-либо агрегаты GROUP, а скорее упорядочение по дате, а затем по идентификатору пользователя:

SELECT
  id, 
  user_id, 
  date_recorded
FROM tbl
ORDER BY date_recorded DESC, user_id ASC

Вот будет результат. Изменение порядка примечаний на date_recorded из исходного примера

id  | user_id | date_recorded
1   | 1       | 2011-11-07
3   | 1       | 2011-11-06
2   | 1       | 2011-11-05    
5   | 2       | 2011-11-06
4   | 2       | 2011-11-03

Обновление

Для получения полной последней записи для каждого user_id требуется JOIN. Подзапрос (mx) находит последний date_recorded для user_id, и этот результат объединяется с полной таблицей для извлечения оставшихся столбцов.

SELECT 
  mx.user_id,
  mx.maxdate,
  t.id
FROM (
  SELECT
    user_id,
    MAX(date_recorded) AS maxdate
  FROM tbl
  GROUP BY user_id
) mx JOIN tbl t ON mx.user_id = t.user_id AND mx.date_recorded = t.date_recorded
0 голосов
/ 07 ноября 2011

Я просто использую технику

"Использование предложения порядка перед группой путем вставки его в предложение group_concat"

SELECT SUBSTRING_INDEX(group_concat(cast(id as char)
                                    ORDER BY date_recorded desc),',',1),
       user_id,
       SUBSTRING_INDEX(group_concat(cast(`date_recorded` as char)
                                    ORDER BY `date_recorded` desc),',',1)
FROM data
GROUP BY user_id
...