Requête mysql : Tri complexe des commentaires par votes

Discussion dans 'Développement d'un site Web ou d'une appli mobile' créé par tagada, 13 Octobre 2010.

  1. tagada
    tagada Nouveau WRInaute
    Inscrit:
    13 Octobre 2010
    Messages:
    4
    J'aime reçus:
    0
    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:
    ------------------------------------------
    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:
    ------------------------------------
    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:
    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:
    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 :)
     
  2. spout
    spout WRInaute accro
    Inscrit:
    14 Mai 2003
    Messages:
    8 782
    J'aime reçus:
    240
  3. tagada
    tagada Nouveau WRInaute
    Inscrit:
    13 Octobre 2010
    Messages:
    4
    J'aime reçus:
    0
  4. spout
    spout WRInaute accro
    Inscrit:
    14 Mai 2003
    Messages:
    8 782
    J'aime reçus:
    240
    :?:

    Exemple plus simple:
    Code:
    $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/
     
  5. Aaarrrgggh
    Aaarrrgggh WRInaute occasionnel
    Inscrit:
    16 Mars 2009
    Messages:
    299
    J'aime reçus:
    0
    Hello,

    est-ce vraiment pertinent ce genre de tri ? Les utilisateurs ne vont rien comprendre, surtout si certains répondent à d'autres, non ?
     
  6. spout
    spout WRInaute accro
    Inscrit:
    14 Mai 2003
    Messages:
    8 782
    J'aime reçus:
    240
    +1 j'ai pensé pareil, pour trier des commentaires ça ne va pas être génial
     
  7. tagada
    tagada Nouveau WRInaute
    Inscrit:
    13 Octobre 2010
    Messages:
    4
    J'aime reçus:
    0
    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...
     
  8. tagada
    tagada Nouveau WRInaute
    Inscrit:
    13 Octobre 2010
    Messages:
    4
    J'aime reçus:
    0
    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
     
Chargement...
Similar Threads - Requête mysql Tri Forum Date
Requête Mysql avec des string Développement d'un site Web ou d'une appli mobile 6 Février 2018
[mysql] trier les résultats d'une requête selon une table non liée à la requête Développement d'un site Web ou d'une appli mobile 15 Avril 2011
Requete mysql Développement d'un site Web ou d'une appli mobile 30 Mai 2017
Problème requête mysql Développement d'un site Web ou d'une appli mobile 1 Mars 2017
[php/mysql] Eviter de faire 20 requêtes pour un affichage Développement d'un site Web ou d'une appli mobile 19 Janvier 2016
requete Mysql et classement des résultats Administration d'un site Web 1 Novembre 2015
Mysql requête imbriquée Développement d'un site Web ou d'une appli mobile 1 Octobre 2015
[MySQL] Requête SELECT et INSERT entre 3 tables liées+Aide Développement d'un site Web ou d'une appli mobile 30 Avril 2014
Question pour une requête MYSQL Développement d'un site Web ou d'une appli mobile 29 Mai 2013
Réunir 2 requêtes MySql Développement d'un site Web ou d'une appli mobile 22 Mai 2013
  1. Ce site utilise des cookies. En continuant à utiliser ce site, vous acceptez l'utilisation des cookies.
    Rejeter la notice