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


bugland
Réponse acceptée

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
bugland
Réponse acceptée

Dans ce cas il faudrait faire un ORDER by datemessage DESC

bugland
Réponse acceptée

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

@bugland tu as raison

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

bugland :
f.date corredond à f.datemessage ?

Oui a datemessage je corrige mon post.

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.

La dernière position c'est à dire ?

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

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 ?

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

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

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.

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

Merci, je vais y jeter un oeil x)

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