Système de remerciements

Aide optimisation affichage

a marqué ce sujet comme résolu.

Salut à tous :)

J'ai déjà posté sur OC où j'ai pu obtenir une aide de Julp, mais étant donné qu'on a pas vraiment trouvé de solution, je tente ici, peut-être que quelqu'un d'autre aura une idée :) .

Donc je suis en train de bosser sur un système de remerciements de posts, dont voici les caractéristiques :

  • Un sujet peut contenir plusieurs posts.
  • Un post peut être remercié 0 ou n fois.
  • Un membre peut remercier 0 ou 1 fois un post.
  • A la fin de chaque post, j'aimerai afficher la liste des gens ayant remercié le post.
  • Sur chaque post, l'utilisateur a une icône permettant de remercier l'utilisateur du message, s'il a déjà remercié l'utilisateur, l'icône change pour permettre à l'utilisateur de retirer son remerciement.

C'est le même principe que les j'aime sur Facebook.

Actuellement, j'ai une table qui est la suivante : forum_posts_thanks(uid, postid) tous les deux en clés uniques.

Du coup, je cherchais comment faire pour coder tout ça. Je n'ai eu aucun soucis pour l'insertion des données dans la BDD, par contre pour l'affichage je galère un peu. Comment faire pour afficher la liste des remerciements en bas de chaque post sans faire de requête dans une boucle (sachant que mon forum a déjà 19 requêtes et qu'il y a 20 messages par page, il y aurait donc 39 requêtes) ?

J'ai réussi à avoir un résultat avec le code suivant :

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
SELECT post.post_id, post.topic_id, post.post_content,post.post_date, post.post_sender, post.post_helped,  post.post_reported, post.post_edit_time, post.post_edit_reason, post.post_ip, 
       user.id, user.avatar, user.login, user.signature, user.nbPosts, groups.color, groups.groupid, groups.name,
       GROUP_CONCAT(fpt.user_id) as thankslist, GROUP_CONCAT(fpt_users.login) as user_list
FROM forumposts post
        LEFT JOIN users user ON user.id = post.post_sender
        LEFT JOIN groups ON groups.id = user.groupid
        LEFT JOIN forum_posts_thanks fpt ON fpt.post_id = post.post_id
        LEFT JOIN users fpt_users ON fpt_users.id = fpt.user_id
WHERE post.topic_id = :tid
GROUP BY post.post_id
ORDER BY post.post_date ' . $order . ' LIMIT '.$limit;

Mais c'est un peu bancal comme code (mais ça marche) et je ne sais pas ce que ça vaut niveau optimisation ^^ . Les deux premières jointures permettent de récupérer les informations sur le posteur du message, la troisième de récupérer la liste des "remercieurs" et la dernière de récupérer leurs pseudos. Est-ce qu'il vaut mieux faire une requête dans une boucle ? Ou est-ce qu'il y aurait une solution moins bancale ?

Julp m'a suggéré l'idée de récupérer la liste des gens ayant remercié uniquement à la demande (donc en Ajax), cette solution me plait bien, mais pose un problème puisque sans la liste des utilisateurs ayant remercié le message, je ne vois pas vraiment comment savoir si un membre a déjà remercié ou non un message (encore une fois sans faire de requêtes supplémentaire).

Bref, je suis un peu de l'impasse. Du coup si quelqu'un aurait une idée pour faire un truc propre, je ne serai pas contre ^^ . Sinon je m'en tiendrai à ma solution, à priori vu les statistiques du forum (et le sujet), il y a peu de chances qu'un message soit remercié plus de 50 fois, mais ça m'embête quand même un peu.

Merci d'avance pour votre aide !

A bientôt.

Bonne idée, je vais y jeter un oeil. Le code est un peu compliqué pour moi étant donné mes faibles connaissances en python, mais je vais essayer d'y comprendre quelque chose ^^ .

M'enfin, si quelqu'un a une idée je suis quand même prenante :) .

Non c'est pas tout à fait la même chose que le système de +1/-1; sur ZDS on ne peut pas récupérer la liste des gens qui ont mis des +1/-1 à tel ou tel post (ou en tout cas je n'ai jamais vu). IL n'en reste pas moins que la structure de la base doit être la même sur ce point ou quasiment.

Si tu veux tout faire en une seule requête, alors le group_concat est nécessaire; il n'y a pas d'alternative plus simple, du moins il ne me semble pas à première vue.

Mais la première question à se poser est, est-ce vraiment utile d'afficher l'information d'office ? Si je veux vraiment savoir qui a mis +1 à mon post, un clic ne me paraît pas dramatique; c'est probablement dans ce sens qu'on te proposait une solution AJAX. L'afficher d'office pour tous les posts ne me paraît pas vraiment utile; dans 99% des cas on se fout pas mal de savoir qui exactement a mis +1/-1.

Par contre 19 requêtes pour une page de forum, ça me paraît énorme; sur mon propre forum, il n'y a certes pas de système de +1/-1 ou similaire, et je m'en sors avec 6 ou 7 requêtes grand maximum (et encore, c'est sur les pages de MP). Tu dois avoir un problème de conception ailleurs à mon avis.

+0 -0

Non c'est pas tout à fait la même chose que le système de +1/-1; sur ZDS on ne peut pas récupérer la liste des gens qui ont mis des +1/-1 à tel ou tel post (ou en tout cas je n'ai jamais vu). IL n'en reste pas moins que la structure de la base doit être la même sur ce point ou quasiment.

QuentinC

C'est juste que la fonctionnalité en question n'a pas été mise en place, mais c'est prévu et la structure de la BDD ne devrait pas changer (ou alors pour ajouter une éventuelle date histoire d'ordonner les choses).

Autrement je plussoie l'idée d'afficher la liste uniquement à la demande (au clic ou au survol, voire en chargeant les infos pour tous les posts au chargement de la page, histoire de ne pas bloquer le rendu mais d'avoir les infos pré-chargées si c'est vraiment utile) pour ne pas trop alourdir la page (récupérer le nombre devrait être suffisant et assez simple à faire).

Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte