Partage
  • Partager sur Facebook
  • Partager sur Twitter

nombre de reponse utilisateur qui match

    22 juin 2021 à 16:06:18

    Bonjour à tous, J'ai un quizz avec 4 tables : questions, réponses et reponses_utilisateurs, et utilisateurs. 

    J'aimerais retourner avec sql un résultat avec le nombre de questions qui match entre deux utilisateurs. 

    J'ai déjà commencer, et ça marche bien. Le problème c'est que j'aimerais aussi avoir ce qui match pas, donc avoir un numberOfmath = 0. Mais je n'arrive pas à l'avoir. Je n'ai que ceux qui match entre eux.

    Voici mes bases et la ligne sql:

    select  ru1.fk_utilisateur_id, ru2.fk_utilisateur_id, count(ru2.fk_utilisateur_id) as numberOfMatch
    from reponses_utilisateurs ru1
    join reponses_utilisateurs ru2 on ru1.fk_reponse_id = ru2.fk_reponse_id 
    where ru1.fk_utilisateur_id = 7 and ru1.fk_utilisateur_id <> ru2.fk_utilisateur_id 
    GROUP BY ru2.fk_utilisateur_id
    ORDER by ru1.fk_utilisateur_id, ru2.fk_utilisateur_id
    LIMIT 20

    Le truc c'est que j'aimerais retourner aussi les utilisateurs aux quels le numberOfMatch est égale à 0 dans la même requête.

    Merci d'avance :)

    • Partager sur Facebook
    • Partager sur Twitter
      22 juin 2021 à 17:44:09

      Bonjour,

      Attention, car en fonction du nombre d'utilisateurs cela peut faire beaucoup de résultat !

      SELECT 
      	U2.id AS util2,
      	SUM( IF( RU2.fk_utilisateur_id IS NULL, 0, 1 ) ) as numberOfMatch
      FROM
      	utilisateurs U1
      		INNER JOIN utilisateurs U2
      			ON U1.id <> U2.id
      		INNER JOIN reponses_utilisateurs RU1
      			ON U1.id = RU1.fk_utilisateur_id
      		LEFT JOIN reponses_utilisateurs RU2
      			ON RU1.fk_reponse_id = RU2.fk_reponse_id
      			AND U2.id = RU2.fk_utilisateur_id
      WHERE U1.id = 7
      GROUP BY U2.id
      ORDER BY U2.id

      On part de l'utilisateur voulu (alias U1 avec clause WHERE) que l'on relie avec tous les autres utilisateurs. Puis on joint sur les réponses de U1 et ensuite une jointure externe pour les réponses de U2.

      L'astuce pour compter est de tester si RU2 est nul alors 0 sinon 1 ...

      Un LIMIT 20 est peut être inutile du coup ...

      -
      Edité par Benzouye 22 juin 2021 à 17:44:46

      • Partager sur Facebook
      • Partager sur Twitter
      Seul on va plus vite, ensemble on va plus loin ... A maîtriser : Conception BDD, MySQL, PHP/MySQL
        22 juin 2021 à 18:57:15

        D'accord merci beaucoup. Mais ducoup j'ai un autre problème avec ça, j'ai une autre table conversations ou je ne veux pas afficher les utilisateurs si ils sont dans la table conversations. 

        J'avais pensé à faire un not exist 

        SELECT 
           U1.id as util1, U2.id AS util2,
            SUM( IF( RU2.fk_utilisateur_id IS NULL, 0, 1 ) ) as numberOfMatch
        FROM
            utilisateurs U1
                INNER JOIN utilisateurs U2
                    ON U1.id <> U2.id
                INNER JOIN reponses_utilisateurs RU1
                    ON U1.id = RU1.fk_utilisateur_id
                LEFT JOIN reponses_utilisateurs RU2
                    ON RU1.fk_reponse_id = RU2.fk_reponse_id
                    AND U2.id = RU2.fk_utilisateur_id
        WHERE U1.id = 7 and NOT EXISTS (
            SELECT cv.id
            FROM conversations as cv
            WHERE (RU1.fk_utilisateur_id = cv.fk_utilisateur1_id AND RU2.fk_utilisateur_id = cv.fk_utilisateur2_id) OR (RU2.fk_utilisateur_id = cv.fk_utilisateur1_id AND RU1.fk_utilisateur_id = cv.fk_utilisateur2_id))
        GROUP BY U2.id
        ORDER BY numberOfMatch desc

        Le problème c'est que ducoup ça me met à 0 ceux qui sont présent dans la table conversations au lieu de les supprimer 

        • Partager sur Facebook
        • Partager sur Twitter
          23 juin 2021 à 23:08:45

          avez-vous une idée ? ^^ J'arrive pas à voir comment faire :(
          • Partager sur Facebook
          • Partager sur Twitter
            24 juin 2021 à 8:46:26

            SELECT 
            	U2.id AS util2,
            	SUM( IF( RU2.fk_utilisateur_id IS NULL, 0, 1 ) ) as numberOfMatch
            FROM
            	utilisateurs U1
            		INNER JOIN utilisateurs U2
            			ON U1.id <> U2.id
            		LEFT JOIN conversations C
            			ON (
            				U1.id = C.fk_utilisateur1_id
            				AND U2.id = C.fk_utilisateur2_id
            			) OR (
            				U2.id = C.fk_utilisateur1_id
            				AND U1.id = C.fk_utilisateur2_id
            			)
            		INNER JOIN reponses_utilisateurs RU1
            			ON U1.id = RU1.fk_utilisateur_id
            		LEFT JOIN reponses_utilisateurs RU2
            			ON RU1.fk_reponse_id = RU2.fk_reponse_id
            			AND U2.id = RU2.fk_utilisateur_id
            WHERE
            	U1.id = 7
            	AND C.id IS NULL
            GROUP BY U2.id
            ORDER BY U2.id

            Une jointure externe de plus sur la table conversations, avec deux conditions distinctes pour traiter les deux couples.

            -
            Edité par Benzouye 24 juin 2021 à 8:47:14

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

            nombre de reponse utilisateur qui match

            × 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