Подтвердить что ты не робот

Использование ORDER BY и GROUP BY вместе

Моя таблица выглядит так (и я использую MySQL):

m_id | v_id | timestamp
------------------------
6    |   1  | 1333635317
34   |   1  | 1333635323
34   |   1  | 1333635336
6    |   1  | 1333635343
6    |   1  | 1333635349

Моя цель - взять каждый m_id один раз и упорядочить по наивысшей отметке времени.

Результат должен быть:

m_id | v_id | timestamp
------------------------
6    |   1  | 1333635343
34   |   1  | 1333635336

И я написал этот запрос:

SELECT * FROM table GROUP BY m_id ORDER BY timestamp DESC

Но результаты:

m_id | v_id | timestamp
------------------------
34   |   1  | 1333635323
6    |   1  | 1333635317

Я думаю, что это связано с тем, что он сначала выполняет GROUP_BY, а затем ЗАКАЗЫВАЕТ результаты.

Любые идеи? Спасибо.

4b9b3361

Ответ 1

Один из способов сделать это, который правильно использует group by:

select l.* 
from table l
inner join (
  select 
    m_id, max(timestamp) as latest 
  from table 
  group by m_id
) r
  on l.timestamp = r.latest and l.m_id = r.m_id
order by timestamp desc

Как это работает:

  • выбирает последнюю временную метку для каждого отдельного m_id в подзапросе
  • выбирает только строки из table, которые соответствуют строке из подзапроса (эта операция - там, где выполняется соединение, но ни одна колонка не выбрана из второй таблицы, она просто используется как фильтр) "semijoin" в случае, если вам было любопытно)
  • заказывает строки

Ответ 2

Если вы действительно не заботитесь о том, какая временная метка вы получите, а ваш v_id всегда будет одинаковым для данного m_i, вы можете сделать следующее:

select m_id, v_id, max(timestamp) from table
group by m_id, v_id
order by timestamp desc

Теперь, если v_id изменяется для данного m_id, тогда вы должны сделать следующее

select t1.* from table t1
left join table t2 on t1.m_id = t2.m_id and t1.timestamp < t2.timestamp
where t2.timestamp is null
order by t1.timestamp desc

Ответ 3

Вы можете попробовать это

 SELECT tbl.* FROM (SELECT * FROM table ORDER BY timestamp DESC) as tbl
 GROUP BY tbl.m_id  

Ответ 4

SQL >

SELECT interview.qtrcode QTR, interview.companyname "Company Name", interview.division Division 
FROM interview 
JOIN jobsdev.employer 
    ON (interview.companyname = employer.companyname AND employer.zipcode like '100%')
GROUP BY interview.qtrcode, interview.companyname, interview.division
ORDER BY interview.qtrcode;

Ответ 5

Просто вам нужно спуститься с asc. Напишите запрос, как показано ниже. Он вернет значения в порядке возрастания. SELECT * FROM table GROUP BY m_id ORDER BY m_id asc;

Ответ 6

Вам нужно заменить DESC на ASC. Напишите такой запрос, и он вернет значения в порядке возрастания.

SELECT * FROM table GROUP BY m_id ORDER BY m_id ASC;