Bonjour,

Voila je rencontre un petit problème avec mon code.

Pour l'instant je fais 2 requêtes, mais s'il est possible d'en faire une seule ça m'arrangerait :)
Voilà les 2 requêtes depuis php. J'aurais besoin aussi du total de votes sur les 7 derniers jours pour pouvoir faire un pourcentage (ici ça aurait été la taille du tableau récupéré par fetchAll sur la 2eme requête)

$query = $bdd->prepare('SELECT candidat,nom_complet FROM candidats');
$query = $bdd->prepare('SELECT id_candidat FROM votants WHERE date_vote BETWEEN DATE_SUB(NOW(), INTERVAL 7 DAY) AND NOW()');

Voilà le détail des champs de mes tables:
table candidats:
Colonne Type
id int(11)
candidat varchar(20) utf8_general_ci
votes int(11)
nom_complet varchar(200)

table votants:
Colonne Type Interclassement Opérateur Valeur
id int(11)
id_candidat varchar(20) utf8_general_ci
ip varchar(20) utf8_general_ci
user_agent varchar(220) utf8_general_ci
uuid varchar(50) utf8_general_ci
date_vote datetime

Dans la table candidat le nombre total de votes par candidat est comptabilisé, mais aucune information de date, c'est pour ça que je dois passer par une requête directe sur la table des votants pour avoir les votes sur les 7 derniers jours.
Chaque votant vote pour un candidat (stocké dans id_candidat qui sera le même que candidat dans la table candidats) puis les informations pour sécuriser les votes, ip, uuid qui est un numéro unique, user_agent, la date du vote etc...
Vu que pour avoir un résumé rapide du nombre de vote affiché à chaque génération de la page html, pour que ce soit rapide j'ai mis le total des votes dans la table candidats, du coup ça marche bien, et c'est rapide....Mais pour avoir un total sur 7 jours seulement je suis obligé de repasser par le comptage des votes.
J'espère que ça sera clair :) (je doute un peu mais bon)

12 réponses


saibe
Réponse acceptée

dommage, gt entrain de t'écrire une soluce
un exemple de 'GROUP BY' sans condition, histoire que tu vois comment ça fonctionne :

$sql = "SELECT c.nom_complet, COUNT(c.id) FROM candidats as c"; // on récupère le nom du candidat et le nb d'occurence (la table candidats a pour alias c)
$sql.= " INNER JOIN votants as v"; // jointure avec votants alias v
$sql.= " ON c.id = v.id_candidat"; // condition de la jointure <-- là tu modifies pour que ça fonctionne chez toi (je te laisse réfléchir... si tu veux pas de int...)
$sql.= " GROUP BY c.nom_complet"; // on met les name ensemble

$query = $bdd->prepare($sql);

$query->execute();

while($candidat = $query->fetch(PDO::FETCH_ASSOC)){ // comme on dit par chez moi : "gros doigts"
    echo $candidat[nom_complet'] . ' = ' . $candidat['COUNT(c.id)'] . ' votes<br>';
}

re ;)
alors, procédons dans l'ordre :

  1. modifie ton champ id_candidat en int, de ta table votants
    c ce qui fera le lien entre votants et candidats de manière plus efficace (tu pourras modifier le nom du candidat sans avoir de pb de lien)
    la suite dans point 2. ;)
maroufle
Auteur

Oui, enfin le problème est que tous ces votes sont envoyés en ajax par un script javascript, et je me sers des id html pour identifier ces votes, du coup il faudrait une refonte complète pour changer ce comportement :(

J'ai pensé à faire un tout dynamique, au niveau du nommage et des tables, mais j'ai pas eu le courage vu le travail que ça aurait représenté. En gros tout commence par mon HTML et les tables sont juste là pour faire des comptes et des enregistrements ;)

tout y est ;) à toi de l'adapter...

maroufle
Auteur

Merci je garde ça sous le coude pour prévoir ce genre de fonctionnement à la conception sur un nouveau site...
La ça fonctionne, ça restera comme ça jusqu'à la fin des élections, ça reste assez rapide :)

:) c gentil de mettre résolu, mais j'aurai préféré que tu le mettes en place ;)
si tu gardes ta soluce tu affaiblis ton système : il devient moins efficace et surtout plus difficile à maintenir....
cela dit, content de t'avoir aidé :)

j'insiste mais, tu pourrais expliquer :

le problème est que tous ces votes sont envoyés en ajax par un script javascript,
je me sers des id html pour identifier ces votes,
du coup il faudrait une refonte complète pour changer ce comportement :(

et enfin, je te remercie d'avoir ouvert un post adéquat ;) il peut aider d'autres personnes...

maroufle
Auteur

Oui c'est moins modulable tel quel, mais c'est pas très grave, les élections sont dans moins de 2 mois du coup après ça j'aurais tout le temps de faire un système plus modulaire...J'ai quelques idées pour en faire quelque chose de vraiment complet, mais ya tout à prendre en compte, le front et backend, tout est à améliorer, et pour l'instant ça serait trop de boulot.
Regarde sur sondage-elections.fr si tu veux voir ce que ça donne tel quel, il faut regarder les requêtes xhr pour voir les requêtes sur le serveur qui ne prend que du php.(c'est moche, mais fonctionnel :) )
Pour le frontend faut vraiment que la prochaine fois je prévois quelque chose de plus joli et modulaire aussi...Sans alourdir de trop les temps de chargement et la compatibilité.

Mais sinon t'inquiète pas je garde ta réponse, j'y reviendrais plus tard, c'est l'avantage des forums on a les réponses pour longtemps :)
(la partie rajoutée est sur les tendances des 7 derniers jours)

ton site est intéressant (niveau contenu ;) c'est l'essentiel ) juste un truc : mets les photos en fixed ou autre chose pour que le click sur la table et la photo qui appear soit au même niveau....

maroufle
Auteur

Ouai mais je peux pas, pour avoir une ergonomie mobile, j'y ai pensé bien sûr, mais bon, faire un site adaptative, ça se fait à coup de sacrifice souvent, malheureusement :(
Bref pour le prochain je me baserais sur des templates, parce que je suis vraiment pas doué pour faire un design complet et responsive.
Quand on voit la qualité de certains templates et leur modularité, et le fait de pouvoir les customizer à sa sauce, c'est un gain de temps énorme et c'est joli aussi :)

ok :) donc rdv aux prochaines élections... si nous ne sommes pas en guerre civile d'ici là ;)