Requête enregistrements récents et GROUP BY

Mammouth du PHP | 531 Messages

30 avr. 2010, 12:28

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 =)

Mammouth du PHP | 672 Messages

30 avr. 2010, 12:55

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 ?

Mammouth du PHP | 531 Messages

30 avr. 2010, 13:12

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

Mammouth du PHP | 672 Messages

30 avr. 2010, 14:21

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 ?)...

Mammouth du PHP | 531 Messages

30 avr. 2010, 15:58

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

Mammouth du PHP | 672 Messages

30 avr. 2010, 16:21

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.

Mammouth du PHP | 531 Messages

30 avr. 2010, 16:41

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