Page 1 sur 1

Requête enregistrements récents et GROUP BY

Posté : 30 avr. 2010, 12:28
par supercanard
Bonjour,

Voici tout dabord la structure de ma table :

id id_article date
1 23 2009-01-01
2 23 2010-03-01
3 44 2009-01-01
4 44 2010-03-01

Et voilà mon problème :
Je voudrais récupérer les enregistrement les plus récents de ma table mais en les groupant par id_article.
Ma requête devrait donc me renvoyer les enregistrement 2 et 4

Mais dans la pratique je n'y arrive pas :
SELECT * FROM blog_comment 
GROUP BY id_article 
ORDER BY date DESC
Je comprends dailleur très bien pourquoi ça ne peut pas marcher de cette façon, mais par contre je ne trouve pas la bonne façon.
Si quelqun à une petite idée =)

Re: Requête enregistrements récents et GROUP BY

Posté : 30 avr. 2010, 12:55
par macgawel
Je voudrais récupérer les enregistrement les plus récents de ma table mais en les groupant par id_article.
Il faut procéder par étape...
1. Comment ferais-tu pour chercher le(s) enregistrement(s) le(s) plus récent(s) de ta table ?
2. A partir de là, comment peux-tu faire pour grouper ces enregistrements pas id_article, et est-ce nécessaire ?

Re: Requête enregistrements récents et GROUP BY

Posté : 30 avr. 2010, 13:12
par supercanard
Je voudrais récupérer les enregistrement les plus récents de ma table mais en les groupant par id_article.
Il faut procéder par étape...
1. Comment ferais-tu pour chercher le(s) enregistrement(s) le(s) plus récent(s) de ta table ?
2. A partir de là, comment peux-tu faire pour grouper ces enregistrements pas id_article, et est-ce nécessaire ?
1. ORDER BY date DESC
2. GROUP BY id_article

Le problème est que l'ordre s'applique sur les résultats groupés, il faudrait que ce soit l'inverse...
Je pourrais par facilité faire un traitement PHP derrière pour arriver a ce résultat, mais tant qu'a faire si je peut le faire directement dans la requête... donc oui c'est necessaire

Re: Requête enregistrements récents et GROUP BY

Posté : 30 avr. 2010, 14:21
par macgawel
1. ORDER BY date DESC
Ca te donne tous les enregistrements, triés par date décroissante.
Pour trouver le(s) dernier(s) il faut commencer par trouver la date la plus récente :
SELECT MAX(date) FROM matable
Ensuite, il faut récupérer les enrigistrements faits à cette date :
SELECT * from matable WHERE date = (SELECT MAX(date) FROM matable)
Au passage : évite de donner date comme nom de champ : c'est souvent un mot réservé et ce n'est pas forcément très clair (date de quoi ?)...

Re: Requête enregistrements récents et GROUP BY

Posté : 30 avr. 2010, 15:58
par supercanard
Merci pour cet exemple de requête, par contre si je ne dit pas de betise ça ne fait que renvoyer l'enregistrement le plus recent ?
( Un peu comme si on faisait un SELECT suivis de ORDER BY date DESC LIMIT 0,1 )

Moi ce que j'essaye de faire est plutot de récupérer les entrées ( pas que la dernière ) classées par date, mais surtout de les grouper par id_article :

Code : Tout sélectionner

id id_article date 1 23 2009-01-01 2 23 2010-03-01 3 44 2009-01-01 4 44 2010-03-01
Le résultat attendu serait donc une entrée ( la plus récente ) par id_article :

2 23 2010-03-01
4 44 2010-03-01

Re: Requête enregistrements récents et GROUP BY

Posté : 30 avr. 2010, 16:21
par macgawel
OK, ce n'était pas clair (enfin, je n'avais pas compris ça :oops: )

On reprend :
SELECT MAX(date) FROM matable
renvoie la date la plus récente.
Maintenant tu veux aussi avoir les id_article.
SELECT id_article, MAX(date) FROM matable
Mais ça renvoie une erreur :cry:
MAX() est un opérateur de groupe - il prend plusieurs enregistrements et en retourne un construit à partir de ces enregistrements.
Si on veut avoir d'autres champs, il faut opérer un groupement dessus :
SELECT id_article, MAX(date) FROM matable GROUP BY id_article
Va renvoyer, pour chaque id_article, le MAX des date.
en règle générale, quand on utilise un opérateur de groupe (MAX, COUNT, MIN, ...) les autres champs demandés doivent être regroupés avec une clause GROUP BY.

Re: Requête enregistrements récents et GROUP BY

Posté : 30 avr. 2010, 16:41
par supercanard
Merci bien pour les explications.

En fait on se rapproche de la requête de départ.

Pour compléter, je rajoute l'order :
SELECT id_article FROM blog_comment GROUP BY id_article 
ORDER BY MAX(date) DESC