Version complète: sur le forum Webmaster Hub : max() en gardant la bonne ligne
Webmaster Hub > Création et exploitation de Sites Internet > Les langages du Net > SQL
sarc
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 smile.gif

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 :

CODE
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...
petit-ourson
Je me demande si je n'ai pas certains scripts qui sont foireux du coup, après avoir lu ta question...

Sinon la documentation mySQL nous explique le tout : http://dev.mysql.com/doc/refman/5.0/fr/exa...aximum-row.html
sarc
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... tongue.gif

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

CODE
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. smile.gif Merci Petit-Ourson en tout cas wink.gif
petit-ourson
Par contre attention car pour faire tomber un serveur de base de données, il n'y a rien de mieux. ;o)
Ceci est une version "bas débit" de notre forum. Pour voir la version complète avec plus d'information, la mise en page et les images, veuillez cliquer ici.