Requête mysql : Tri complexe des commentaires par votes

tagada
Nouveau WRInaute
Nouveau WRInaute
 
Messages: 4
Inscription: 13 Oct 2010

Requête mysql : Tri complexe des commentaires par votes

Message le Mer Oct 13, 2010 15:13

Bonjour, tout est dans le titre ! :D

Pour les commentaires des articles, j'ai une table 'commentaires' avec notamment les champs id, date et commentaire :
Code: Tout sélectionner
------------------------------------------
ID  |   DATE    |   COMMENTAIRE         |
------------------------------------------
1   |   12/10   |  comm 1               |
------------------------------------------
2   |   12/10   |  comm 2               |
------------------------------------------
3   |   13/10   |  comm 3               |
------------------------------------------


J'ai une autre table 'votes' avec les champs id, comment (= id table commentaires) et vote
Le champ vote=1 est un vote pour, vote=0 est un vote contre.
Code: Tout sélectionner
------------------------------------
ID   |   COMMENT   |       VOTE     |
------------------------------------
1   |       1      |      1         |
------------------------------------
2   |       2      |      0         |
------------------------------------
3   |       1      |      1         |
------------------------------------

Dans cet exemple le commentaire 1 a 2 votes pour, le comm 2 a 1 vote contre et le com 3 n'a pas de vote.


Avec la requête suivante, j'obtiens la liste des commentaires par date inverse :
Code: Tout sélectionner
SELECT * FROM commentaires WHERE (je vérifie que le com. corresponde à l'article) ORDER BY date DESC


Le problème c'est que les votes s'affichent aléatoirement. Je souhaiterait que les commentaires les mieux notés s'affichent en haut, les plus mal notés en bas, et les sans notes au milieu, donc d'après la table ci-dessus, le commentaire 1 puis le comm 3 et enfin le com 2.

La requête suivante me donne les commentaires les mieux notés, les plus mal notés et enfin le reste :
Code: Tout sélectionner
SELECT * FROM commentaires AS c LEFT JOIN votes AS v ON v.comment=c.id WHERE (je vérifie que le com. corresponde à l'article) ORDER BY v.vote DESC, date DESC


Dans l'idéal je souhaiterais que :
    - les commentaires les mieux notés (si la somme de ses votes pour est supérieure à celle des contres) apparaissent en haut puis régressivement
    - les commentaires sans note (donc sans entrée dans la table vote), au milieu
    - les commentaires les plus mal notés (si la somme de ses votes contre est supérieure à celle des pour) apparaissent en bas
    - cerise sur le gâteau, les derniers commentaires des dernières x heures apparaissent en haut (peut importe leur vote) puis cèdent leur place. Mais je me contenterais des 3 premiers points.


Et c'est la que je patauge. J'ai fait des essais avec des group by, des cases, des sum, sans aucun résultat.

Je me doute qu'il faut additionner tous les commentaires de la table 'commentaires' (un SUM(*) sur cette table?), puis additionner tous ceux dont la valeur est 1, puis tout ceux dont la valeur est 0, puis en déduire ceux qui n'ont aucune valeur et enfin les trier.

Mais je n'ai aucune idée de la façon de le faire. Une piste please?
Merci :)


spout
WRInaute accro
WRInaute accro
 
Messages: 4382
Inscription: 14 Mai 2003

Re: Requête mysql : Tri complexe des commentaires par votes

Message le Mer Oct 13, 2010 15:17

Il y a une méthode pour le tri des votes pondéré d'après le nombre total de votes:
http://en.wikipedia.org/wiki/Bayesian_average

Exemple en PHP/MySQL:
http://www.kobrascorner.com/tech/weighted-bayesian.php

tagada
Nouveau WRInaute
Nouveau WRInaute
 
Messages: 4
Inscription: 13 Oct 2010

Re: Requête mysql : Tri complexe des commentaires par votes

Message le Mer Oct 13, 2010 15:22

spout a écrit:Il y a une méthode pour le tri des votes pondéré d'après le nombre total de votes:
http://en.wikipedia.org/wiki/Bayesian_average

Exemple en PHP/MySQL:
http://www.kobrascorner.com/tech/weighted-bayesian.php



Wouah! quelle rapidité! merci je regarde ça !


EDIT : Mouais, je me disais... :?


spout
WRInaute accro
WRInaute accro
 
Messages: 4382
Inscription: 14 Mai 2003

Re: Requête mysql : Tri complexe des commentaires par votes

Message le Mer Oct 13, 2010 15:31

tagada a écrit:EDIT : Mouais, je me disais... :?

:?:

Exemple plus simple:
Code: Tout sélectionner
$avg_num_votes = 18; // Average number of votes in all products
$avg_rating = 3.7; // Average rating for all products
$this_num_votes = 6; // Number of votes for this product
$this_rating = 4; // Rating for this product


$bayesian_rating = ( ($avg_num_votes * $avg_rating) + ($this_num_votes * this_rating) ) / ($avg_num_votes + $this_num_votes);

Source: http://snipplr.com/view/29775/bayesian-rating--weighted-voted-rating-system/


Aaarrrgggh
WRInaute occasionnel
WRInaute occasionnel
 
Messages: 394
Inscription: 16 Mar 2009

Re: Requête mysql : Tri complexe des commentaires par votes

Message le Mer Oct 13, 2010 15:34

Hello,

est-ce vraiment pertinent ce genre de tri ? Les utilisateurs ne vont rien comprendre, surtout si certains répondent à d'autres, non ?


spout
WRInaute accro
WRInaute accro
 
Messages: 4382
Inscription: 14 Mai 2003

Re: Requête mysql : Tri complexe des commentaires par votes

Message le Mer Oct 13, 2010 15:36

Aaarrrgggh a écrit:Hello,

est-ce vraiment pertinent ce genre de tri ? Les utilisateurs ne vont rien comprendre, surtout si certains répondent à d'autres, non ?

+1 j'ai pensé pareil, pour trier des commentaires ça ne va pas être génial

tagada
Nouveau WRInaute
Nouveau WRInaute
 
Messages: 4
Inscription: 13 Oct 2010

Re: Requête mysql : Tri complexe des commentaires par votes

Message le Mer Oct 13, 2010 15:37

spout a écrit: :?:

Exemple plus simple:
Code: Tout sélectionner
$avg_num_votes = 18; // Average number of votes in all products
$avg_rating = 3.7; // Average rating for all products
$this_num_votes = 6; // Number of votes for this product
$this_rating = 4; // Rating for this product


$bayesian_rating = ( ($avg_num_votes * $avg_rating) + ($this_num_votes * this_rating) ) / ($avg_num_votes + $this_num_votes);

Source: http://snipplr.com/view/29775/bayesian-rating--weighted-voted-rating-system/


Oui, je comprends bien (enfin, j'essaie), mais ma logique de tri est plus simple : il s'agit de simples additions.

Le commentaire qui aura 357 votes pour et 327 contre sera tout en haut tandis que celui qui aura 356 pour et 0 contre sera 2ème, celui qui aura 200 pour et 300 contre dernier, et au milieu les commentaires sans vote.

Donc pas de moyenne pour le classement...

tagada
Nouveau WRInaute
Nouveau WRInaute
 
Messages: 4
Inscription: 13 Oct 2010

Re: Requête mysql : Tri complexe des commentaires par votes

Message le Mer Oct 13, 2010 15:40

Aaarrrgggh a écrit:Hello,

est-ce vraiment pertinent ce genre de tri ? Les utilisateurs ne vont rien comprendre, surtout si certains répondent à d'autres, non ?


En fait il s'agit surtout d'un tri pour éviter la modération (d'ou les commentaires des dernières heures en haut si c'est possible), ce n'est pas comme un forum avec une arborescence (pas de réponses).

Mais je comprends que ça semble bizarre


Si vous avez aimé cette discussion, partagez-la sur vos réseaux sociaux préférés :

Lectures recommandées sur ce thème :



Qui est en ligne

Utilisateurs parcourant ce forum: Aucun utilisateur enregistré et 1 invité