Aller au contenu

JOIN MYSQL


billcom

Sujets conseillés

Bonjour le hub,

Je me tourne vers vous à nouveau pour un problème lié à une requête a éxécuter sous mysql.

Voici la situation :
Je suis en train de développer un outil tout simple de messagerie interne au site sous forme de ticket. Rien de nouveau la dedans

Voici mes 2 tables :

message (idMessage, textMessage, dateMessage, islu, emmeteur, destinataire, #idTicket);

ticket (idTicket, titre, dateMessage, dateOuverture, client);

J'aimerai trouver une requête qui me permettra d'afficher un tableau avec la présentation suivante :

Pour chaque ticket :

Afficher le titre du ticket et le dernier message (le message le plus récent ) du ticket.

SELECT DATE_FORMAT(dateMessage, '%d/%m%/%Y') as dateAffMessage, islu, titre, emmeteur,  t.idTicket, textMessage                          FROM (message)                          LEFT JOIN `ticket` t ON `t`.`idTicket` = `message`.`idTicket`                          LEFT JOIN (                                    SELECT                                             Max(dateMessage) as dateMessageMax, idTicket, textMessage as txt                                    FROM                                            message`                                    GROUP BY                                            idTicket                                    ) as DernierMessages ON DernierMessages.dateMessageMax = message.dateMessage AND messagerie_message.idTicket = DernierMessages.idTicket WHERE $custQuery GROUP BY `idTicket` ORDER BY `dateMessage` DESC, `idMessage` DESC LIMIT $limit,$offset 


Dans ma variable $custQuery nous avons le destinataire ou l'emmeteur du message afin de pouvoir afficher une boite d'envoi et une boite de reception.

ex :

WHERE destinataire = 1

Cela affichera les message pour le compte client ayant pour id 1.

Et c'est justement la que j'ai un soucis car dans le cas ou le dernier message du ticket a été envoyé par l'id 1 ma requette me retourne 0 résultat car y'a pas de correspondance avec la jointure LEFT JOIN.
La solution me semblait être dans le FULL JOIN mais mysql ne gère pas le FULL JOIN. J'en appel donc aux nombreux talents du hub pour m'aider s'il vous plait smile.gif

EDIT -----

Petite précision :

Ayant eu besoin de fouiller dans les bases de phpbb3 récemment j'ai vue qu'ils stockent l'id du dernier message d'un thread dans le table des thread qui serai ici ma table ticket. Cette solution me semble être la moins gourmande en ressources. Mais certainement pas la plus optimisé

Merci pour votre aide,

Anthony

Modifié par billcom
Lien vers le commentaire
Partager sur d’autres sites

Bonjour,



J'ai pas bien compris la question mais mets "$custQuery" dans ta jointure directement.



Si tu le mets dans le "Where", forcément, cela annule l'effet du "Left Join"...




Portekoi


Lien vers le commentaire
Partager sur d’autres sites

Bonjour Portekoi ,



Merci pour ton retour :)


Effectivement ayant le nez dedans j'ai pas pris assez de recule pour mon explication.



Ma close Where me permet d'afficher les messages présents dans la boite d'envoi ou bien dans la boite d'emission puisqu'une image du code vaut mieux q'un long discours voici mon script php juste avant ma requête.



public function getMessages($mailbox, $offset, $limit){
switch($mailbox):
case 'new':
$custQuery = " destinataire = 1 AND islu = 0 ";
break;
case 'reception':
$custQuery = " destinataire = 1 ";
break;
case 'envoi':
$custQuery = " emmeteur = 1 ";
break;
endswitch;

La requête viens juste après.



Et donc pour revenir à ta question :


La clause where demandera respectivement les messages que j'ai envoyé, ou bien les messages que j'ai reçu ou bien les juste les nouveaux messages.


Et dans le cas ou j'ai répondu à tous mes messages, je suis donc le dernier à avoir envoyer un message dans les tickets présent dans mes boites. Ainsi mes 2 closes de la requêtes (JOIN et WHERE) sont en opposition et donc aucun résltat ne ressort.



Pour résumer le problématique :



J'aimerai pouvoir arriver sur un espace de messagerie interne avec pour chaque ticket présent le dernier message correspondant au ticket. Par ticket j'entend le terme d'un "fil de conversation".



Est-ce que c'est mieux expliquer ainsi ?



Merci de ton aide :)



Anthony

Lien vers le commentaire
Partager sur d’autres sites

Alors deux choses :

1/ dans ta requête c'est le ticket qui est doit être dans le premier sélect, car c'est lui que tu veux obtenir et non les messages. C'est ensuite dans ta jointure que tu vas aller chercher le dernier message s'il y en a un.

2/ cette façon de procéder est très mauvaise, car trop coûteuse. La solution de phpbb est effectivement la bonne, tu dois maintenir a jour dans le ticket le id du dernier message. Ceci est fait tout simplement lors de l'insertion d'un message.

Lien vers le commentaire
Partager sur d’autres sites

Veuillez vous connecter pour commenter

Vous pourrez laisser un commentaire après vous êtes connecté.



Connectez-vous maintenant
×
×
  • Créer...