Aller au contenu

max() en gardant la bonne ligne


Sujets conseillés

Posté

Salut à tous,

J'me suis auto-bloqué dans une requète SQL. J'essaye d'optimiser le nombre de requètes SQL de mes programmes, mais parfois c'est difficile :)

En fait j'ai envie d'avoir le dernier message de chaque sujet, ainsi que le nombre de messages dans ce sujet.

J'ai essayé cette requête :

SELECT a.nom, max(b.date_envoi) AS dernier, count(b.id)-1 AS nbrep, b.pseudo
FROM integ_sujets a, integ_message b

WHERE b.id_sujet = a.id
GROUP BY b.id_sujet
ORDER BY dernier DESC

(La requête est volontairement simplifiée, pour simplifier la lecture)

Le problème est que "pseudo" ne correspond pas au pseudo de la ligne avec max(b.date_envoi). En gros, une fois que j'ai la date maximale, j'aimerais lui attacher le pseudo qui correspond au dernier message, mais il me renvoie le premier pseudo qu'il trouve, à cause de GROUP BY.

Vous auriez une idée pour en gros garder la "dernière ligne" de chaque sujet, tout en garder le group by pour compter le nombre de messages ?

En résumé, je voudrais :

- compter le nombre de messages dans chaque sujet

- garder le dernier message

Merci d'avance de vos lumières...

Posté

Ca me fait plaisir de pas être le seul à craindre les requêtes foireuses à cause de ces fichus group by qui groupent pas dans le bon sens... :P

Merci pour avoir trouvé la page, j'ai pas du chercher la bonne expression chez Google. Comme quoi Googliser, c'est un métier.

Pour ceux que ça intéressent, les sous-requêtes peuvent utiliser des valeurs de la requête globale, de la même manière (il ne faut alors pas mettre l'ancienne table dans FROM).

SELECT a.*, count(d.id)-1 AS nbrep, b.pseudo AS pseudopardefaut
FROM integ_sujets a, integ_message b, integ_message d

WHERE b.id_sujet = a.id AND d.id_sujet = a.id
AND b.date_envoi=

(SELECT max(c.date_envoi)
FROM integ_message c
WHERE c.id_sujet = a.id
GROUP BY c.id_sujet)

GROUP BY d.id_sujet
ORDER BY b.date_envoi DESC

Je pense être proche du but avec ça. :) Merci Petit-Ourson en tout cas ;)

Veuillez vous connecter pour commenter

Vous pourrez laisser un commentaire après vous êtes connecté.



Connectez-vous maintenant
×
×
  • Créer...