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.
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:
m_id
dans la sous-requêtetable
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)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
Tu peux essayer ça
SELECT tbl.* FROM (SELECT * FROM table ORDER BY timestamp DESC) as tbl
GROUP BY tbl.m_id
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;
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.
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;