web-dev-qa-db-de.com

Verwenden von ORDER BY und GROUP BY zusammen

Meine Tabelle sieht so aus (und ich benutze MySQL):

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

Mein Ziel ist es, jedes m_id einmal zu nehmen und nach dem höchsten Zeitstempel zu ordnen.

Das Ergebnis sollte sein:

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

Und ich schrieb diese Abfrage:

SELECT * FROM table GROUP BY m_id ORDER BY timestamp DESC

Die Ergebnisse sind jedoch:

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

Ich denke, es verursacht, weil es zuerst GROUP_BY tut und dann die Ergebnisse ordnet.

Irgendwelche Ideen? Vielen Dank.

39
Luis

Eine Möglichkeit, dies zu tun, bei der group by Richtig verwendet wird:

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

Wie das funktioniert:

  • wählt den neuesten Zeitstempel für jeden einzelnen m_id in der Unterabfrage aus
  • wählt nur Zeilen aus table aus, die mit einer Zeile aus der Unterabfrage übereinstimmen (dieser Vorgang - bei dem ein Join ausgeführt wird, in der zweiten Tabelle jedoch keine Spalten ausgewählt sind, sondern nur als Filter verwendet werden - wird als bezeichnet) "semijoin" falls Sie neugierig waren)
  • ordnet die Zeilen an
46
Matt Fenwick

Wenn es Ihnen wirklich egal ist, welchen Zeitstempel Sie erhalten und Ihr v_id Für einen gegebenen m_i Immer derselbe ist, können Sie Folgendes tun:

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

Wenn sich nun der v_id Für einen bestimmten m_id Ändert, sollten Sie Folgendes tun

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
7
Mosty Mostacho

Sie können dies versuchen

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

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;
4
Go ahead

Hier ist die einfachste Lösung

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

Nach m_id gruppieren, aber für jede m_id den maximalen Zeitstempel abrufen.

2
abinash sahoo

Sie müssen nur mit asc absteigen. Schreiben Sie die Abfrage wie folgt. Die Werte werden in aufsteigender Reihenfolge zurückgegeben.

SELECT * FROM table GROUP BY m_id ORDER BY m_id asc;
2
Gurpreet Singh