Requête dernier message

Par Brandon93, il y a 11 ans


Base de données MySQL

Bonjour,

Je recherche actuellement à sélectionner le dernier message regroupé par titre.

Un peu comme le système d'un forum. Lorsque quelqu'un répond à un sujet ancien, celui-ci occupe la première position de la page.

table : forummessages

La requête devrait normalement indiquer la ligne avec l'ID 309 puis l'ID 306

J'ai essayé quelque chose comme ceci, mais je crains que ça ne soit plus compliqué.

SELECT pseudo, titre, MAX(DATE_FORMAT(datemessage, '%a %d %b %Y à %Hh%i')) AS datenouveausujet FROM forummessages WHERE forum=1 AND annonce=0 GROUP BY titre DESC

Quelqu'un aurait une idée ?

Merci d'avance =)

24 réponses

arnich, il y a 11 ans

Si mes souvenirs sont bon il te faut utiliser HAVING

SELECT pseudo, titre FROM forummessages WHERE forum=1 AND annonce=0 GROUP BY pseudo, titre HAVING MAX(datemessage)
Huggy, il y a 11 ans

Bonjour,
Si l'id est en auto-increment, il suit forcement la chronologie, donc il suffit de prendre le MAX(id)

SELECT MAX(id) AS maxid, titre FROM forummessages WHERE forum=1 AND annonce=0 GROUP BY titre;

Si tu veux le reste des champs, tu dois refaire une jointure avec la même table forummessage en utilisant maxid et id.

Brandon93, il y a 11 ans

Les solutions proposées par arnich et Huggy ne semblent pas fonctionner. Je vais regarder ton lien Lartak.
Je vous tiens au courant, merci :)

bugland, il y a 11 ans

Salut voila la requete que je te propose elle renvoie la ligne la plus récente pour chaque titre :

SELECT f.ID, f.titre, f.message FROM forummessages f INNER JOIN (SELECT MAX(datemessage) as dateMax,titre FROM forummessages group by titre) f2 ON f.titre = f2.titre AND f.datemessage = f2.dateMax
Huggy, il y a 11 ans

On avance

SELECT f.ID, f.titre, f.message FROM forummessages f INNER JOIN (SELECT MAX(id) as maxid,titre FROM forummessages GROUP BY titre) f2 ON f.id = f2.maxid

306 Sujet1 GHI
309 Sujet2 PQR

bugland, il y a 11 ans

Par contre fait attention si tu fais le MAX id il va prendre les dernier sujet Crée mais pas les derniers modifiés c'est pour cela que j'ai fais sur le max date. Cela te permet de trouver le dernier message crée ou modifié.

Huggy, il y a 11 ans

@bugland tu as raison

bugland, il y a 11 ans

Tu peux mettre le sujet en résolu si c'est le cas. :)

Brandon93, il y a 11 ans

bugland :
f.date corredond à f.datemessage ?

bugland, il y a 11 ans

Oui a datemessage je corrige mon post.

Brandon93, il y a 11 ans

J'avais essayé :) Je pense qu'on frôle la solution...
Lorsque j'édite mon message, il prend la dernière position et non la première.

bugland, il y a 11 ans

La dernière position c'est à dire ?

Brandon93, il y a 11 ans

Dans ma boucle.
Imaginons que j'édite le Sujet 2, il sera positionné après Sujet 1

bugland, il y a 11 ans

Dans ce cas il faudrait faire un ORDER by datemessage DESC

Brandon93, il y a 11 ans

Génial ! Merci.
La solution est donc la suivante :

SELECT f.ID, f.titre, f.message, f.pseudo, f.datemessage FROM forummessages f INNER JOIN (SELECT MAX(datemessage) as dateMax,titre FROM forummessages group by titre ) f2 ON f.titre = f2.titre AND f.datemessage = f2.dateMax ORDER BY datemessage DESC

Si je souhaite modifier le format de la date, est-ce que cela est possible avec cette requête ?
J'ai essayé :

DATE_FORMAT(f.datemessage, '%a %d %b %Y à %Hh%i') AS f.datemessage

Mais je ne sais pas si c'est la bonne convention ?

bugland, il y a 11 ans

tu veux que la date apparaisses sous quel forme donne un exemple 27/04/2015 ?

Brandon93, il y a 11 ans

Par exemple "lun 27 avril 2015 à 16h03" ?

bugland, il y a 11 ans

Pour avoir ce format la il te faudra le traiter en php car mysql te sortira pas lundi en francais.

Brandon93, il y a 11 ans

Avant de rendre fonctionnelle la requête ci-dessus, j'y était pourtant parvenu.
Exemple :

<?php $bdd->query("SET NAMES 'UTF8', lc_time_names = 'fr_FR'"); $req = $bdd->prepare("SELECT id,pseudo,message,DATE_FORMAT(datemessage, '%a %d %b %Y à %Hh%i') AS datepublication,forum FROM forummessages WHERE forum = :forum AND titre = :titre"); $array = array ( 'forum' => $_GET['c'], 'titre' => utf8_encode($titre) ); $req->execute($array); foreach ($req as $donnee) { echo $donnee['datepublication'] }
arnich, il y a 11 ans

Je decouvre juste cette API mais je pense que Carbon peut te permettre de formatter ta date comme tu le souhaites.
Je ne te dirai pas comment exactement car je n'ai pas encore eu le temps de m'y pencher plus que ca.

http://carbon.nesbot.com/docs/#api-formatting

Brandon93, il y a 11 ans

Merci, je vais y jeter un oeil x)

bugland, il y a 11 ans

En laissant le "lc_time_names = 'fr_FR'" qui fait la traduction essaye ca :

SELECT concat(DAYNAME(datemessage), " ", MONTHNAME(datemessage), " ", YEAR(datemessage), " à ", HOUR(datemessage), "h", MINUTE(datemessage)) from forummessages
Brandon93, il y a 11 ans

Amazing !
J'ai encore pas mal de boulot pour être autant performant.
Merci à tous pour les multiples tentatives. C'est tjrs une joie de passer ici :)