Использование 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, а затем ЗАКАЗЫВАЕТ результаты.
Любые идеи? Спасибо.
Ответы
Ответ 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;