Parcours anormal d'un tableau au retour d'une requête SQL (avec un UNION)

Hello,

Mon objectif : réaliser un comptage de résultat sur un table qui contient les résultats d’un sondage. Lorsqu’un votant met « oui », je renseigne pour son résultat un 0 et lorsqu’il met « non », je renseigne un 1.

Voici le code :

        $query = $GLOBALS['pdo']->prepare("     SELECT          COUNT(vote_id) as nbr0
                                                FROM            votes_votants
                                                WHERE           vote_votes_id = :vote_id1
                                                AND             vote_choix='0'
                                                UNION
                                                SELECT          COUNT(vote_id) as nbr1
                                                FROM            votes_votants
                                                WHERE           vote_votes_id = :vote_id2
                                                AND             vote_choix='1'");
        $query->bindValue(':vote_id1',$vote_id,PDO::PARAM_INT);
        $query->bindValue(':vote_id2',$vote_id,PDO::PARAM_INT);
        $query->execute();
        while ($datas = $query->fetch())
        {
                $nbr0 = $datas['nbr0'];
                $nbr1 = $datas['nbr1'];
        }

La requête, elle même prise indépendamment du code me renvoie 2 lignes :

4
9

Donc $nbr0 devrait valoir 4 et $nbr1 valoir 9.

Maintenant, mon code PHP me renvoie ceci :

9

  • Première anomalie : je n’ai qu’un résultat, alors que j’ai pourtant 2 lignes attendues…
  • Deuxième anomalie : Pourquoi 9 et pas 4 ? Comme si le résultat de nbr1 écrasait le résultat de nbr0

J’ai modifié mon code pour parcourir mon tableau différemment (à coup de fetchall et foreach), même résultat. Puis j’ai également utilisé les index des tableaux plutôt que les noms pour ressortir mes valeurs, même résultat aussi.

Là je sèche complètement.

Pouvez-vous m’aider ?

quelle est la structure de ta table?
Pourquoi faire un union, ce n’est pas utile:

select vote_id, count(vote_id) from votes_votans group by vote_id;

merci pour ton aide !

Pour la structure :

|#|Nom|Type|Interclassement|Attributs|Null|Valeur par défaut|Commentaires|Extra|
|1|vote_id |int(9)|||Non|Aucun(e)||AUTO_INCREMENT|
|2|vote_votes_id|int(9)|||Non|Aucun(e)|||
|3|vote_matricule|int(6)|||Non|Aucun(e)|||
|4|vote_choix|tinyint(1)|||Non|Aucun(e)|||
|5|vote_heure|datetime|||Non|current_timestamp()|||

J’ai une autre table qui contient la référence du sondage (avec le sujet, et d’autre paramètres).

Donc là je prends tous les résultats correspondant au vote_votes_id (l’id de mon sondage) et je veux avoir le nombres de vote_choix à 0 et ceux à 1.

Pour info, avec ton correctif ça donne chez moi :

SELECT          COUNT(vote_id)
                                                        FROM            votes_votants
                                                        WHERE           vote_votes_id = 133
                                                        GROUP BY        vote_choix

(où 133 est l’id d’un sondage)

Ton optimisation est donc la bonne approche côté SQL, j’ai modifié mon code, mais ça ne corrige pas mon problème d’origine. Je ne comprends pas pourquoi on ne dépasse pas la première ligne et pourquoi cette première ligne prend le résultat de la seconde.

C’est parce que tu n’a pas pris la requête correctement:
vote_id correspond au vote choisi, et vote_choix le oui ou non?

dans ce cas la requête est plutôt:
select vote_choix, count(vote_choix) from votes_votans where vote_id=133 groupe by vote_choix
Tu comptes les oui et les nom pour le vote numéro 133.
Pour compter pour tous les votes:
select vote-id,vote_choix, count(vote_choix) from votes_votans where vote_id=133 groupe by vote-id,vote_choix

Hello, oui, c’est bien ça, mais dans ce cas je traite commence résultat avec PHP ?

Le resultat final de ta requête se retrouve dans un fetch, avec 3 champs si tu couvre tous les votes, 2 champs si tu couvre un vote particulier dans la clause where sur le champ vote_id.
Le premier tuple sera les votes 0 le deuxième les votes 1 (suivant la valeur du champ vote_choix).

Ok, je viens de comprendre… je commençais au mauvais endroit ! Mille mercis !

1 J'aime