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 =)
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
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
Bonjour.
Ta requête n'est pas correcte, surtout que lorsqu'il faut ordonner des enregistrements, normalement c'est sous la forme :
ORDER BY field DESC
Cadeau : SQL.sh : Cours et tutoriels sur le langage SQL » SQL ORDER BY.
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)
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.
Les solutions proposées par arnich et Huggy ne semblent pas fonctionner. Je vais regarder ton lien Lartak.
Je vous tiens au courant, merci :)
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
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é.
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.
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 ?
Pour avoir ce format la il te faudra le traiter en php car mysql te sortira pas lundi en francais.
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']
}
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.
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 :)