2017-09-19 1 views
0

J'ai une table avec des données comme les suivantes: Nom, Ville, Dernière mise à jour. Je veux obtenir toutes les données de la table distinctes par nom, mais enregistrer seulement où la dernière mise à jour est la dernière.
Par exemple. s'il y a 2 enregistrements
Bill, LA, 2017-09-11
Bill, NY, 2017-09-19
Dans ce qui précède, la requête ne devrait renvoyer que l'enregistrement Bill, NY, 2017-09-19. De cette façon, je veux tous les enregistrements où le nom est distinct mais la dernière mise à jour est la dernière (décroissante).

Quelle requête sql ferait le travail?MySQL - SELECT toutes les colonnes où une colonne est DISTINCT par Dernière date

+1

Qu'avez-vous essayé jusqu'à présent? – bbrumm

+0

Avez-vous cherché dans Stack Overflow avant de l'afficher pour voir si vous pouviez trouver une solution déjà existante? –

+0

J'ai fait une recherche sur Stack Overflow mais je n'ai pas trouvé la réponse dont j'avais besoin. – Greatchap

Répondre

3

Je poste ceci principalement parce que les autres réponses/commentaires ont semblé être outre de ce dont vous avez besoin ici. Si tout ce que vous vouliez obtenir étaient la mise à jour lastest associée à chaque nom, vous pouvez utiliser la requête simple GROUP BY suivante:

SELECT Name, MAX(LastUpdated) 
FROM yourTable 
GROUP BY Name 

Mais si vous voulez obtenir le plein dernier enregistrement (ie toutes les colonnes) pour chaque nom, vous rencontrez un problème parce que GROUP BY nous permet seulement de sélectionner Name ou d'autres colonnes dans un agrégat (pas tout à fait vrai si l'autre colonne peut être uniquement déterminée par Name, mais vrai en général). Une façon canonique d'aller ici serait de simplement joindre votre table d'origine à ce qui précède en tant que sous-requête, et filtrer toutes les lignes à l'exception de la dernière pour chaque nom.

SELECT t1.* 
FROM yourTable t1 
INNER JOIN 
(
    SELECT Name, MAX(LastUpdated) AS max_last_updated 
    FROM yourTable 
    GROUP BY Name 
) t2 
    ON t1.Name = t2.Name AND 
     t1.LastUpdated = t2.max_last_updated 
1
SELECT t1.* 
FROM Tablename AS t1 
(
    SELECT name, MAX(LastUpdated) AS LastUpdated 
    FROM Tablename 
    GROUP BY name 
) AS t2 INNER JOIN t1.name = t2.name 
       AND t1.LastUpdated = t2.LastUpdated 
2

Ceci peut être résolu en deux étapes:

  1. Trouver la ligne avec le LAST_UPDATED_DATE
  2. afficher toutes les données de cette ligne.

La requête pourrait être:

SELECT 
t.name, 
t.city, 
t.last_updated 
FROM yourtable t 
WHERE t.last_updated = (
    SELECT MAX(s.last_updated) 
    FROM yourtable s 
    WHERE s.name = t.name 
); 
+0

Merci. Cependant, je peux remplacer SELECT t.name, t.city, t.last_updated avec t. * Ici. – Greatchap

+0

Oui, vous pouvez, mais c'est une meilleure pratique et plus facile à maintenir si vous spécifiez les noms de colonnes plutôt que t. * – bbrumm

+0

Si je souhaite ajouter une clause where par exemple. recherche sur la base du nom ou de toute colonne et obtenir le dernier record alors que faire? – Greatchap