Compter le nombre de champ où la valeur n'est pas NULL

Eléphant du PHP | 172 Messages

09 mai 2006, 16:53

Salut à tous,

Je cherche à ajouter à une requête, ceci :

Compter le nombre de champ parmi les champs c3, c4, c5 de la table sondage où la valeur n'est pas NULL (par défaut), et l'affecter à un allias.

Ceci afin de récupérer le nombre de choix disponible lors de chaque sondage.

Mes deux tables sont construites de cette façon :

Image

Les colonnes c1_tt, c2_tt, c3_tt, c4_tt, c5_tt ne servent qu'à enregistrer le résultat final de chaque vote lors du changement de sondage.

Comme vous l'aurez sans doute compris selon le sondage choisi, le nombre de réponse possible varie de 2 à 5 choix possible.

J'ai essayé de faire un truc du style :
$sql = "SELECT COUNT(choix) AS votes, choix, (COUNT(c3) + COUNT(c4) + COUNT(c5)) + 2 AS tt_choix
        FROM sondage, sondage_vote WHERE sondage_vote.nom = (SELECT nom FROM sondage WHERE sondage.actif IS NOT NULL) GROUP BY choix;";
$req = mysql_query($sql) or die (mysql_error());


while( $a = mysql_fetch_array($req) )
{
  echo $a['choix'];
  echo $a['votes'];
  echo '<br /><br />';
}

echo 'nbr choix : ' . mysql_result($req, 0, 'tt_choix') . '<br />';
Mais bien évidemment, ça ne fonctionne pas et me renvoi pour tt_choix la valeur de 6, donc 4 en enlevant le + 2 :?
Alors que seulement 3 champs sont différent de NULL dans ma table.

Donc, comment faire pour compter parmi trois champ dans une ligne de la table sondage le nombre de champs où la valeur est autre que NULL ?

Merci.

Eléphant du PHP | 377 Messages

09 mai 2006, 18:49

et si au lieu de stocker null / autre chose tu stockais 0/1 ? t'aurais plus qu'à faire l'addition de tous les champs pour savoir combien sont remplis.
Après il faut voir si c'est envisageable et si ça n'implique pas de changer tout ton code :wink:
Petit scarabée deviendra grand

Invité
Invité n'ayant pas de compte PHPfrance

09 mai 2006, 19:09

Merci

Mais je ne peux mettre 0 et 1 car ces champs contiennent les choix du votes , donc des chaînes de caractères, et par défaut les champs c3, c4, c5 sont nuls.

Pour l'instant je m'en suis contenté de le faire avec le php car je n'arrive pas à trouver.

Ce qui me donne :
$sql = "SELECT COUNT(choix) AS votes, choix, c1, c2, c3, c4, c5
        FROM sondage, sondage_vote 
        WHERE sondage_vote.nom = (SELECT nom FROM sondage WHERE sondage.actif IS NOT NULL) GROUP BY choix;";
$req = mysql_query($sql) or die (mysql_error());

// Les résultats
while( $resultats = mysql_fetch_assoc($req) )
{
    $choix_clef[] .= $resultats['choix'];
    $choix_val[] .= $resultats['votes'];
}

//  Vérification si tous les choix de sondage sont utilisés dans sondage_vote
for($i=1; $i<6; $i++)
{
    $cc = mysql_result($req, 0, 'c'.$i);
    if($cc !== NULL)
    {
        // vérification qu'il est dans le tableau et le cas contraire ajout de celui-ci avec une valeur de 0.
        if( !in_array($cc, $choix_clef) )
        {
            $choix_clef[] .= $cc;
            $choix_val[] .= 0;
        }
    }
}
// fusion des tableaux
$votes = array_combine($choix_clef, $choix_val);
C'est pas tip-top :?

Eléphanteau du PHP | 17 Messages

10 mai 2006, 11:22

ca prend deux seconde faut juste connaitre les p'tites fonctions sql de BASE !

SELECT id, (ISNULL(c3) + ISNULL(c4) + ISNULL(c5)) AS nbchoix_vide
FROM sondage

A noter que ta table est tres mal modélisé : aucune possiblité d'évolution si tu devait passer a 10 réponses par exemple !

Eléphant du PHP | 172 Messages

12 mai 2006, 17:46

Oui en effet, mais bon, je me suis pas encore penché de près sur le langage sql, je procède par étape et suis extrêmement lent :mrgreen:
A noter que ta table est tres mal modélisé : aucune possiblité d'évolution si tu devait passer a 10 réponses par exemple !
Non, ma table est très bien et j'y ai bien réfléchi, 5 choix maximum pour un petit sondage présent sur quelques-unes de mes pages, je trouve ça largement suffisant, en général cela se limite en général à 3 possibilités.

Merci :P