Partage
  • Partager sur Facebook
  • Partager sur Twitter

Problème de jointure

Système lu/non-lu

Sujet résolu
    13 novembre 2010 à 20:13:15

    Bonjour à tous.
    Désolé si mon titre n'est pas explicite, mais je n'ai pas trouvé mieux. Enfin, bref, je vais exposer mon problème.

    J'ai codé mon propre forum, avec tout ce qu'il faut, et j'ai même intégré un système de lu/non-lu. Tout allait bien, jusqu'au jour où j'ai décidé qu'on puisse voir à la page d'accueil du forum, dans quelle forum il y a de nouvelles réponses.

    Je possède une table forum_lu :
    • lu_id
    • lu_id_topic
    • lu_id_autor
    • lu_lu
    • Etc ...

    Quand un membre visite un topic pour la première fois, une nouvelle ligne s'ajoute dans la base de données. lu_id_topic contiendra l'id du topic qu'il visite, lu_id_autor son id, et lu_lu sera mis à 1, ce qui veut dire qu'il a déjà lu le topic.

    Maintenant, une nouvelle réponse vient sur le topic. Le lu_lu de cette personne sera à nouveau mis à 0. Quand il liste les topics sur ce forum, il verra une petite icône clignotante à côté du titre du topic, ce qui veut dire qu'il y a une nouvelle réponse. Jusque là, tout va bien.
    Maintenant, imaginons que je veuille indiquer à la personne dans quels forums il y a de nouvelles réponses quand il vient sur la page d'accueil.

    Voici la requête simplifiée pour lister les forums :
    SELECT fcat_id, fcat_title [...], forum_forum.forum_title As forum_title [...]
    FROM forum_cat
    LEFT JOIN forum_forum.forum ON forum_cat.fcat_id = forum_forum.forum_id_cat
    -- Le reste on s'en fout
    

    Je pense qu'il n'y a pas besoin de montrer la structure des deux tables forum_forum et forum_cat.

    J'ai pensé qu'en ajoutant une simple jointure, j'arriverais à résoudre le problème :
    SELECT fcat_id, fcat_title [...], forum_forum.forum_title As forum_title [...], forum_lu.lu_lu AS lu_lu
    FROM forum_cat
    LEFT JOIN forum_forum.forum ON forum_cat.fcat_id = forum_forum.forum_id_cat
    LEFT JOIN forum_lu ON forum_forum.forum_id = forum_lu.lu_id_forum AND forum_lu.lu_autor_id = '.$user->get_id().' AND forum_lu.lu_lu = 0
    -- Le reste on s'en fout
    

    Il suffisait de contrôler à l'affichage :
    <?php
    if($data['lu_lu'] === NULL) {
       echo '<img src="lu.png" alt="" />';
    }
    else {
       echo '<img src="non_lu.png" alt="" />';
    }
    


    Cela marche bien, pour autant qu'il n'y ait qu'un seul topic non_lu par forum. Si maintenant il existe plusieurs topics non_lu dans un forum, la jointure va simplement dupliquer ce forum à l'affichage.

    Enfin, ma question est, comment résoudre ce problème tout en restant dans la même requête SQL. Donc, je n'aimerais pas faire plus de requêtes sql. Je verrai bien une sous-requête genre :
    SELECT COUNT(*) AS nbr_lu FROM forum_lu WHERE lu_lu = 0 AND lu_id_autor = '.$user->get_id().' AND lu_id_forum = 'id_du_forum'
    

    Mais je ne vois absolument pas comment intégrer cela à ma jointure.

    Merci de vos réponses.
    • Partager sur Facebook
    • Partager sur Twitter
      13 novembre 2010 à 22:13:34

      Oui, mais non.

      Il faut stocker dans ta table forum_lu, l'id du dernier post que le mec en question a lu.

      Ensuite, si il existe un (ou des) posts d'id supérieur(s) à celui-ci dans ce topic cela veut dire qu'il y a des posts non lus, et tu peux amener directement l'utilisateur au premier post non lu (et non au dernier post, si ça a floodé 4 pages depuis la dernière fois qu'il est venu, il va pas s'y retrouver).

      • Partager sur Facebook
      • Partager sur Twitter
        13 novembre 2010 à 22:20:33

        Juste pour info, l'id du dernier post lu est inséré dans la base de donnée, mais j'ai évité de le préciser car c'est inutile pour résoudre mon problème.
        • Partager sur Facebook
        • Partager sur Twitter
          13 novembre 2010 à 23:37:38

          > l'id du dernier post lu est inséré dans la base de donnée

          Comme il est inséré dans ta table forum_lu, ça change pas mal les requêtes, puisque du coup, la colonne "lu_lu" est à supprimer. D'ailleurs cette table devrait s'appeler topic_lu...

          Il faudrait savoir si tu veux :

          - afficher "nouveau" si des forums contiennent des topics nouveaux (ligne inexistante dans forum_lu)
          - ou seulement des topics qui ont des nouveaux posts

          Comment tu gères les topics suivis ? (grosso modo les topics où le mec a posté, mais on peut élaborer)

          Et aussi comment tu comptes implémenter "marquer tous les messages comme lus" (sinon tous les forums auront toujours le flag "nouveau" tant que le mec n'a pas lu tous les topics qui sont dedans...)

          • Partager sur Facebook
          • Partager sur Twitter
            14 novembre 2010 à 9:33:32

            Bon, j'ai résolu facilement le problème, en faisant une requête à côté qui génère un Array() avec le nombre de message(s) non lu(s) pour chaque forum.

            Citation : Lord Casque Noir

            > l'id du dernier post lu est inséré dans la base de donnée

            Comme il est inséré dans ta table forum_lu, ça change pas mal les requêtes, puisque du coup, la colonne "lu_lu" est à supprimer. D'ailleurs cette table devrait s'appeler topic_lu...


            Enfin, une url est stockée dans la bdd qui dirige l'utilisateur vers le dernier post lu. Donc non, je ne devrais pas changer mes requêtes.

            Citation : Lord Casque Noir


            - afficher "nouveau" si des forums contiennent des topics nouveaux (ligne inexistante dans forum_lu)
            - ou seulement des topics qui ont des nouveaux posts


            Problème résolu ! D'ailleurs, le deuxième point n'était pas mon problème.

            Citation : Lord Casque Noir


            Comment tu gères les topics suivis ? (grosso modo les topics où le mec a posté, mais on peut élaborer)


            On peut mettre le topic en favori. Il y a trois liens sur la page d'accueil du forum quand on est connecté :
            - Les derniers topics visités
            - Liste des dernières participations
            - Et liste des topics favoris

            Citation : Lord Casque Noir


            Et aussi comment tu comptes implémenter "marquer tous les messages comme lus" (sinon tous les forums auront toujours le flag "nouveau" tant que le mec n'a pas lu tous les topics qui sont dedans...)


            C'est très simple à implémenter, il me suffit d'une seule requête :
            UPDATE forum_lu SET lu_lu = 1 WHERE lu_id_forum = 'id_du_forum' AND lu_id_autor = '.$user->get_id().'
            


            Et voilà, tous les topics sont lus pour un forum pour un utilisateur.
            • Partager sur Facebook
            • Partager sur Twitter

            Problème de jointure

            × 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