2009-11-05 3 views
4
SELECT user_id, created FROM photo_comments GROUP BY user_id 

retoursGrouper par première occurrence de champ Comment puis-je obtenir le dernier?

user_id created 
    1  2009-10-20 21:08:22 
    12  2009-10-20 21:45:00 
    16  2009-10-28 20:35:30 

Mais cette date de création de 2009-10-20 pour ID utilisateur 1 est la première entrée par ID utilisateur 1.

Comment puis-je obtenir la dernière entrée par ID utilisateur 1? (date devrait être 2009-11-02)

J'essaie d'obtenir la dernière entrée par chaque utilisateur dans l'ordre du plus récent en premier.

+0

Gardez à l'esprit que ce groupe "sélectionne" une occurence "non spécifiée" du champ, et non la première. Pour être honnête, il ne devrait rien sélectionner et la requête devrait échouer (cela n'a aucun sens). Mais MySQL pour une raison quelconque permet de telles requêtes. – shylent

+0

J'adorerais avoir une fonction d'agrégat 'some()' qui choisit une valeur pratique dans une colonne non-group-by. –

Répondre

5

Le SQL ordinaire n'est pas censé autoriser ce type de requête en premier lieu. En théorie, vous pouvez uniquement demander un champ que vous avez nommé dans une clause GROUP BY ou une fonction agrégée d'un autre champ. Voici comment vous construiriez votre requête modifiée. (Vous pouvez ensuite ajouter d'autres champs sur la première ligne.)

SELECT user_id, created 
FROM photo_comments o 
WHERE created = 
    (SELECT MAX(created) 
    FROM photo_comments i 
    WHERE o.user_id=i.user_id) 
+0

C'est la meilleure façon, à mon avis. –

+0

mysql ne semble pas s'occuper de votre intérieur et extérieur. 'Erreur dans votre syntaxe SQL près de "externe"' –

+0

'outer' et' inner' sont des mots-clés utilisés avec des jointures. Je me souviens d'habitude de ce petit détail la première fois que j'exécute la requête et obtiens l'erreur de syntaxe. J'ai corrigé la réponse maintenant en les renommant 'o' et' i'. –

7

Cela fonctionne:

SELECT user_id, max(created) FROM photo_comments GROUP BY user_id 
+2

Dans cette version, vous ne pouvez pas ajouter d'autres champs (comme 'photo_id' ou' comment_id') dans la requête et attendez-vous à ce qu'ils fonctionnent correctement. –

+0

il suffit d'ajouter 'ORDER BY max (created) DESC' à la fin –

0

SELECT ne user_id, créé à partir photo_comments commande par desc créé GROUP BY user_id

fonctionne pas?

+0

Il commande le jeu de résultats, de sorte que le jeu d'exemples que j'ai posté est répertorié dans l'ordre inverse, ne reçoit toujours pas les entrées les plus récentes. –

Questions connexes