Partage
  • Partager sur Facebook
  • Partager sur Twitter

SQL Récupérer les utilisateurs d'une conversation

Conversation en duo ou plus

    20 septembre 2019 à 15:35:40

    Bonjour,

    Je développe un petit système de messagerie sous forme de conversation. Les conversations peuvent être à 2 ou à plus de 2.

    Avec la requête suivante, je parviens à obtenir toutes les conversations auxquelles un utilisateur connecté à participé, elle affiche l'avatar du destinataire et la date du dernier message posté.

    SELECT 
      Messagerie.conv AS `Messagerie__conv`, 
      Conversation.statut AS `Conversation__statut`, 
      Conversation.user_conv AS `Conversation__user_conv`, 
      Conversation.type_conv AS `Conversation__type_conv`, 
      (
        MAX(Messagerie.created)
      ) AS `created` 
    FROM 
      conversation Conversation 
      LEFT JOIN users Users ON Users.id = (Conversation.user_conv) 
      LEFT JOIN messagerie Messagerie ON Messagerie.conv = (Conversation.conv) 
    WHERE 
      (
        Conversation.conv in (
          SELECT 
            Conversation.conv AS `Conversation__conv` 
          FROM 
            conversation Conversation 
          WHERE 
            user_conv = 'username'
        ) 
        AND user_conv != 'username'
      ) 
    GROUP BY 
      Messagerie.conv 
    ORDER BY 
      created DESC

    Cela fonctionne bien , cependant , dans le cas ou l'utilisateur à participé à une conversation avec plus de 2 destinataires, je ne parviens pas à obtenir tous les avatars des participants, je n'en obtiens qu'un seul.

    Voici un aperçu de la table des conversations (attention, noms très fantaisistes)

    Est il possible d'obtenir le résultat escompté en modifiant la requête précédente ou dois-je partir sur autre chose ?

    Merci d'avance pour toute suggestion

    • Partager sur Facebook
    • Partager sur Twitter
      20 septembre 2019 à 16:34:27

      Bonjour,

      christ57 a écrit:

      Cela fonctionne bien , cependant , dans le cas ou l'utilisateur à participé à une conversation avec plus de 2 destinataires, je ne parviens pas à obtenir tous les avatars des participants, je n'en obtiens qu'un seul

      Oui, tu t'es laissé abuser par le fonctionnement de MySQL et du GROUP BY ... Un autre SGBD t'aurait jeté une erreur sur l'incohérence entre SELECT et GROUP BY, explication : http://cedric-duprez.developpez.com/tutoriels/mysql/demythifier-group-by/

      Peux-tu nous montrer ce que tu voudrais que la requête te retourne pour la conv 2024527820 et le user test ?

      Partons de là :

      SELECT
      	M.conv,
      	C.type_conv,
      	DM.created,
      	C.statut,
      	C.user_conv,
      	C.type_user_conv
      FROM
      	(
      		-- Dernier message par conversation
      		SELECT conv, MAX( created ) AS max_date
      		FROM messagerie
      		GROUP BY conv
      	) M
      		INNER JOIN conversation CU
      			ON M.conv = CU.conv
      		INNER JOIN messagerie DM
      			ON CU.conv = DM.conv
      			AND M.max_date = DM.created
      		INNER JOIN conversation C
      			ON DM.conv = C.conv
      		INNER JOIN users U
      			ON C.user_conv = U.id
      WHERE CU.user_conv = 'username'
      ORDER BY DM.created DESC

      Au passage pas besoin de LEFT JOIN puisque si ta base est bien conçu l'utilisateur existe toujours, et il y a toujours au moins un message dans chaque conversation ...

      Personnellement, j'aurais modéliser cela différemment :

      • users ( id_user [pk], nom, avatar, etc. )
      • roles ( id_role [pk], libelle )
      • conversation ( id_conv [pk], id_creator [fk], date_creation, titre )
      • participant ( id_conv [pk][fk], id_user [pk][fk], id_role [fk] )
      • messages ( id_message [pk], id_user [fk], date_creation, contenu, etc. )

      -
      Edité par Benzouye 20 septembre 2019 à 16:57:00

      • Partager sur Facebook
      • Partager sur Twitter
      Seul on va plus vite, ensemble on va plus loin ... A maîtriser : Conception BDD, MySQL, PHP/MySQL
        21 septembre 2019 à 16:36:58

        Bonjour à toi,

        Merci pour la réponse.

        Le lien partagé est très intéressant, l'article date de 2009 est-il toujours valable ? Peut tu me renseigner sur quel SGBD m'aurait retourner une erreur d'incohérence ?

        Pour la conv 2024527820 et le user test, je souhaiterai qu'il me retourne folder et essai ainsi que la date du dernier message.

        Me passer du left join sur user est logique et fonctionne bien sur PHPMyadmin mais mon framework (CakePHP 3) me retourner une erreur, considérant que la date du dernier message est liée au user qui l'a posté...

        • Partager sur Facebook
        • Partager sur Twitter
          21 septembre 2019 à 17:34:20

          Il est toujours valable ... En fait je crois que tous les autres SGBDR empêche de grouper sans cohérence GROUP BY et SELECT.

          christ57 a écrit:

          Pour la conv 2024527820 et le user test, je souhaiterai qu'il me retourne folder et essai ainsi que la date du dernier message.

          Donc 2 lignes ... avec la même date sur les 2 ? Peux tu donner le tableau attendu exactement ?

          • Partager sur Facebook
          • Partager sur Twitter
          Seul on va plus vite, ensemble on va plus loin ... A maîtriser : Conception BDD, MySQL, PHP/MySQL

          SQL Récupérer les utilisateurs d'une conversation

          × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
          × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
          • Editeur
          • Markdown