Sarc Posté 26 Février 2008 Posté 26 Février 2008 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.pseudoFROM integ_sujets a, integ_message b WHERE b.id_sujet = a.idGROUP BY b.id_sujetORDER 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 Posté 26 Février 2008 Posté 26 Février 2008 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 Posté 26 Février 2008 Auteur Posté 26 Février 2008 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... 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 pseudopardefautFROM integ_sujets a, integ_message b, integ_message d WHERE b.id_sujet = a.id AND d.id_sujet = a.idAND b.date_envoi=(SELECT max(c.date_envoi) FROM integ_message c WHERE c.id_sujet = a.idGROUP BY c.id_sujet)GROUP BY d.id_sujetORDER BY b.date_envoi DESC Je pense être proche du but avec ça. Merci Petit-Ourson en tout cas
petit-ourson Posté 26 Février 2008 Posté 26 Février 2008 Par contre attention car pour faire tomber un serveur de base de données, il n'y a rien de mieux. ;o)
Sujets conseillés
Veuillez vous connecter pour commenter
Vous pourrez laisser un commentaire après vous êtes connecté.
Connectez-vous maintenant