Problème avec une requête !

Eléphant du PHP | 259 Messages

15 nov. 2007, 15:45

Bonjour,

J'ai une table dans ma base qui contient le nombre de personne qui ont participé à un jeux, et donc je souhaite récupérer le nombre de participant.

Voici ma requête :

Code : Tout sélectionner

$req = mysql_query("SELECT DISTINCT id FROM matable"); $total = mysql_num_rows($req);


Donc il y a 2 ligne ds la base pour une participation, dc quand je regarde dans ma base il est écrit : 452 enregistrements

dc divisé par 2 cela fait 226 personnes.

Et ma requête me retourne 224.

Je ne comprend vraiment pas pourquoi il y a une différence..

Si j'enléve le DISTINCT dans ma requête ça me met bien 452.

D'où cela peut venir ?

Mammouth du PHP | 2937 Messages

15 nov. 2007, 15:51

J'ignore ce que comporte ta table comme enregistrements, mais si dans la colonne id il y a une valeur qui apparaît plusieurs fois, la commande SELECT DISTINCT ne retournera qu'un seul des enregistrements à valeur identique. Le manuel de MySQL en donne une parfaite illustration.

Eléphant du PHP | 259 Messages

15 nov. 2007, 15:54

Oui je sais que le DISTINCT renvoi qu'un seul enregistrement ou les id sont égal.
Vu qu'au total il y a 452 enregistrement, la requête devrait me renvoyé 226 et non 224 !

ViPHP
ViPHP | 2287 Messages

15 nov. 2007, 16:04

Ca pourrait vouloir dire qu'une personne a participé deux fois à ton jeu, donc... :-k Quoiqu'il en soit le problème se situe au niveau des données, à toi de regarder pour comprendre le pourquoi du comment ;-)
if(!@work()){ Nespresso(); } else { what(); }
______________________________

Eléphant du PHP | 259 Messages

15 nov. 2007, 16:16

en effet 2 personnes ont joué 2 fois et à quelques secondes d'intervalle, pourtant je vérifie bien si la personne à déjà joué dc normalement elle ne peut pas joué deux fois..

Mammouth du PHP | 2937 Messages

15 nov. 2007, 16:18

La colonne id aurait dû être protégée par une clé d'index unique pour éviter cet imprévu. :wink:

ViPHP
ViPHP | 2144 Messages

15 nov. 2007, 16:20

Utiliser un count dans ta requêtte sql, permettrait d'optimiser en réduisant la charge de travail pour le serveur.

Code : Tout sélectionner

SELECT count(DISTINCT id) FROM matable
Ca évite de rapatrier tous les enregistrements en php, juste pour les compter.

Victor Brito : tout à fait ;) Vive les clé uniques :D

Eléphant du PHP | 259 Messages

15 nov. 2007, 16:28

Comment faire pour protéger mon champ id par une clé d'index unique ?

Le champ id est un auto incremente.

Mammouth du PHP | 2937 Messages

15 nov. 2007, 17:06

Le champ id est un auto incremente.
Auquel cas il vaut mieux lui attribuer une clé primaire.

Y a-t-il, par hasard, des colonnes qui peuvent recevoir comme valeurs des chaînes de caractères pouvant apparaître plusieurs fois (comme les prénoms, par exemple) ? Dans ce cas, ces colonnes doivent recevoir une clé d'index unique.

L'attribution de clés peut s'effectuer lors de la création d'une table :

Code : Tout sélectionner

CREATE TABLE ma_table ( id INT(10) UNSIGNED NOT NULL AUTO_INCREMENT, prenom TEXT NOT NULL, PRIMARY KEY (id), UNIQUE KEY (prenom (255)) );
Avec ce code, je crée une table ma_table comportant deux colonnes, id et prenom, et j'attribue une clé primaire à id et une clé d'index unique à prenom. Le (255) indique le nombre de premiers caractères pris en compte dans la vérification de l'unicité de la valeur du champ (dans ce cas, les 255 premiers caractères) ; il doit être indiqué si la clé unique porte sur une colonne de type TEXT ou BLOB (pour les autres types de colonne, il est omis).

Eléphant du PHP | 259 Messages

15 nov. 2007, 17:16

merci de ta réponse.

Donc ensuite pour vérifier si la personne à déjà jouer ça ne change rien à mon code ?

Code : Tout sélectionner

$sql = "SELECT * FROM matable WHERE id_jeu = '$id_jeu' AND id = '".$_SESSION['id']."'"; $req = mysql_query($sql); $total = mysql_num_rows ($req); if ($total > 0) { déjà joué.. }

ViPHP
ViPHP | 2144 Messages

15 nov. 2007, 17:23

Comme indiqués plus haut, il vaut mieux compter les enregistrements dans la requête avec un count que de le faire en php. Cela permet d'éviter de récupérer tous les enregistrements juste pour les compter: on évite ainsi de solliciter le serveur inutilement.

Mammouth du PHP | 2937 Messages

15 nov. 2007, 17:24

Avec une table créée comme dans mon exemple, lorsque quelqu'un en arrivera au stade de l'enregistrement de ses données dans la base de données, si c'est la deuxième fois qu'il apparaît avec les mêmes données que celles déjà enregistrées dans la colonne à clé unique, l'enregistrement échouera sans qu'il soit nécessaire de vérifier si la personne a déjà joué.