web-dev-qa-db-fra.com

Utiliser ORDER BY et GROUP BY ensemble

Ma table ressemble à ceci (et j'utilise MySQL):

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

Mon objectif est de prendre chaque m_id une fois et de les classer selon l'horodatage le plus élevé.

Le résultat devrait être:

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

Et j'ai écrit cette requête:

SELECT * FROM table GROUP BY m_id ORDER BY timestamp DESC

Mais les résultats sont:

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

Je pense que cela cause parce qu'il commence par GROUP_BY, puis par ORDRE les résultats.

Des idées? Merci.

39
Luis

Une façon de faire qui utilise correctement 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

Comment ça marche:

  • sélectionne l'horodatage le plus récent pour chaque m_id dans la sous-requête
  • ne sélectionne que les lignes de table correspondant à une ligne de la sous-requête (cette opération - dans laquelle une jointure est effectuée, mais aucune colonne n'est sélectionnée dans la deuxième table, elle est simplement utilisée comme filtre - est appelée "semijoin" au cas où vous seriez curieux)
  • ordonne les lignes
46
Matt Fenwick

Si vous ne vous souciez vraiment pas de l'horodatage que vous obtiendrez et que votre v_id Est toujours le même pour un m_i Donné, vous pouvez procéder comme suit:

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

Maintenant, si le v_id Change pour un m_id Donné, alors vous devriez faire ce qui suit

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

Tu peux essayer ça

 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

Voici la solution la plus simple

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

Groupez par m_id mais obtenez le maximum d'horodatage pour chaque m_id.

2
abinash sahoo

Juste vous avez besoin de descendre avec asc. Écrivez la requête comme ci-dessous. Il renverra les valeurs dans l'ordre croissant.

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