Totaliser et plafonner les points attribués par jour dans un système de vote

Pour récompenser les participants à un système de vote j’ai récemment ajouté une règle qui rétribue des points (chaque vote = 1 point) selon un plafond maximal par journée. Vous découvrirez l’implémentation ci-dessous.

L’implémentation s’est révélée relativement simple et se résume à une requête SQL. En gros, l’approche est d’utiliser un GROUP BY pour segmenter les votes par tranche d’un jour ou selon la période souhaitée. En MySQL Il existe la fonction DAY() (ainsi que MONTH() et YEAR()…) à qui on peut envoyer un champ timestamp ou autre. Il existe également une fonction LEAST (dont l’opposé est GREATEST) qui accepte deux valeurs et qui renvoit la plus petite.

Avec ces ingrédients on peut formuler une sous-requête qui va sélectionner le nombre de votes pour établir les points attribués. Ceux-ci sont groupés par jour (GROUP BY DAY(date_vote)) et plafonné grâce au LEAST. La sous requête produit un tableau qui est repris par une deuxième requête qui va tout simplement effectuer une somme.

Requête complète:

SELECT <br />
  sum(points) <br />
FROM <br />
  ( <br />
    SELECT <br />
      LEAST( count(*),20) <br />
    AS <br />
      points <br />
    FROM <br />
      votes <br />
    WHERE <br />
      user_id = 12345 <br />
    GROUP BY <br />
      DAY(date_vote) <br />
  ) <br />
  AS <br />
    votes_per_day

– James Poulson.