Requetes de selection a simplifier

Jeanmi
Invité n'ayant pas de compte PHPfrance

02 sept. 2005, 09:54

Salut a tous !

Je cherche un moyen d'ecrire tout ca de manière plus simple........
J'ai essayé avec un OR ou un AND dans la clause where mais je n'obtiens pas le même résultat..........

$r1=mysql_query("select * from resultats where (MOD(c1,2)=0)") or die ("Erreur lors de la selection des chiffres pairs".mysql_error());
$r2=mysql_query("select * from resultats where (MOD(c2,2)=0)") or die ("Erreur lors de la selection des chiffres pairs".mysql_error());
$r3=mysql_query("select * from resultats where (MOD(c3,2)=0)") or die ("Erreur lors de la selection des chiffres pairs".mysql_error());
$r4=mysql_query("select * from resultats where (MOD(c4,2)=0)") or die ("Erreur lors de la selection des chiffres pairs".mysql_error());
$r5=mysql_query("select * from resultats where (MOD(c5,2)=0)") or die ("Erreur lors de la selection des chiffres pairs".mysql_error());
$r6=mysql_query("select * from resultats where (MOD(c6,2)=0)") or die ("Erreur lors de la selection des chiffres pairs".mysql_error());
$r7=mysql_query("select * from resultats where (MOD(c7,2)=0)") or die ("Erreur lors de la selection des chiffres pairs".mysql_error());

$cc1=mysql_num_rows($r1);
$cc2=mysql_num_rows($r2);
$cc3=mysql_num_rows($r3);
$cc4=mysql_num_rows($r4);
$cc5=mysql_num_rows($r5);
$cc6=mysql_num_rows($r6);
$cc7=mysql_num_rows($r7);

$cc=$cc1+$cc2+$cc3+$cc4+$cc5+$cc6+$cc7;


Merci d'avance pour vos suggestions !!!

JM

Modérateur PHPfrance
Modérateur PHPfrance | 6373 Messages

02 sept. 2005, 09:57

Ceci ne te donne pas le même résultat ?

Code : Tout sélectionner

SELECT COUNT(*) FROM resultats WHERE ( MOD(c1,2)=0 OR MOD(c2,2)=0 OR MOD(c3,2)=0 OR MOD(c4,2)=0 OR MOD(c5,2)=0 OR MOD(c6,2)=0 OR MOD(c7,2)=0 OR )
enfin déjà une première chose, si tu veux juste le nombre de résultats, et pas les données, utilise COUNT(*)

Invité
Invité n'ayant pas de compte PHPfrance

02 sept. 2005, 10:05

Ceci ne te donne pas le même résultat ?

Code : Tout sélectionner

SELECT COUNT(*) FROM resultats WHERE ( MOD(c1,2)=0 OR MOD(c2,2)=0 OR MOD(c3,2)=0 OR MOD(c4,2)=0 OR MOD(c5,2)=0 OR MOD(c6,2)=0 OR MOD(c7,2)=0 OR )

enfin déjà une première chose, si tu veux juste le nombre de résultats, et pas les données, utilise COUNT(*)

ET la valeur obtenue je la récupère comment ??
Avec un mysql_num_rows ???

Merci

Modérateur PHPfrance
Modérateur PHPfrance | 6373 Messages

02 sept. 2005, 10:09

comme n'importe quelle valeur d'une requête :
j'ai oublié d'aliaser le COUNT ce qui sera plus pratique :
$requete = 'SELECT COUNT(*) AS total FROM table';
$exec = mysql_query($requete);

$resultat = mysql_fetch_array($exec);
echo 'Nombre de lignes : '.$resultat['total'];

Eléphanteau du PHP | 25 Messages

02 sept. 2005, 10:16

comme n'importe quelle valeur d'une requête :
j'ai oublié d'aliaser le COUNT ce qui sera plus pratique :
$requete = 'SELECT COUNT(*) AS total FROM table';
$exec = mysql_query($requete);

$resultat = mysql_fetch_array($exec);
echo 'Nombre de lignes : '.$resultat['total'];

Y'a juste un probleme, je n'obtiens pas le meme résultat avec ta méthode.
Avec la méthode originale j'obtenais 6645 et avec la tienne 1880.
Tu as une idée d'ou peut provenir le blème ??

Modérateur PHPfrance
Modérateur PHPfrance | 6373 Messages

02 sept. 2005, 10:21

je pense que cela vient du fait qu'avec les requêtes séparées tu peux compter deux fois une ligne, et là non

ex :
si une ligne a MOD(c1,2)=0 ET MOD(c2,2)=0, elle ne sera comptée qu'une fois

donc il faut déjà savoir si chaque condition compte 1 point, ou si la ligne est simplement comptée ou non

Eléphanteau du PHP | 25 Messages

02 sept. 2005, 10:28

je pense que cela vient du fait qu'avec les requêtes séparées tu peux compter deux fois une ligne, et là non

ex :
si une ligne a MOD(c1,2)=0 ET MOD(c2,2)=0, elle ne sera comptée qu'une fois

donc il faut déjà savoir si chaque condition compte 1 point, ou si la ligne est simplement comptée ou non

Ben en fait pour la petite explication, ce sont des resultats de loto classés dans une base (c1= chiffre 1 etc.....)
Et la j'aimerai extraire le nombre de chiffres pairs qui sont sortis tous tirages confondus.
Quel serait le genre de requete que je devrais employer alors ???

Modérateur PHPfrance
Modérateur PHPfrance | 6373 Messages

02 sept. 2005, 10:36

c'est un bon exemple pour voir que lorsqu'on a des colonnes quasi-identiques dans une même table, il y aurait peut-être des trucs à revoir ;)

car si tu avais deux tables distinctes : "resultats" et "tirages" par exemples, reliées par un identifiant de "resultats", cela aurait été plus simples:

Code : Tout sélectionner

Resultats Tirages ---------- ------- id_resultat id_tirage date numero id_resultats #
et la requête :

Code : Tout sélectionner

SELECT COUNT(*) AS total_pairs FROM tirages WHERE MOD(numero,2)=0
mais pour ton cas, il faudrait peut-être regarder du coté de IF, pour compter 1 à chaque fois
c'est tout ce qui me viens je vais chercher

Eléphanteau du PHP | 25 Messages

02 sept. 2005, 10:44

c'est un bon exemple pour voir que lorsqu'on a des colonnes quasi-identiques dans une même table, il y aurait peut-être des trucs à revoir ;)

car si tu avais deux tables distinctes : "resultats" et "tirages" par exemples, reliées par un identifiant de "resultats", cela aurait été plus simples:

Code : Tout sélectionner

Resultats Tirages ---------- ------- id_resultat id_tirage date numero id_resultats #
et la requête :

Code : Tout sélectionner

SELECT COUNT(*) AS total_pairs FROM tirages WHERE MOD(numero,2)=0
mais pour ton cas, il faudrait peut-être regarder du coté de IF, pour compter 1 à chaque fois
c'est tout ce qui me viens je vais chercher
Ok j'ai bien noté. J'aurai fais comme ca aussi si je l'avais conçu :wink:
Je vais tâcher de voir si il y a moyen de moyenner avec les IF......
Merci de ton aide.
Si je trouve je poste la soluce.
Sinon ca alourdi considérablement la tache du serveur si je garde la methode initiale ???

@+

Eléphant du PHP | 91 Messages

02 sept. 2005, 16:08

Salut,

Code : Tout sélectionner

create table tirages ( c1 int , c2 int , c3 int): insert tirages values (1,2,3) insert tirages values (1,2,4); insert tirages values (3,5,7); insert tirages values (2,4,8);
une solution :

Code : Tout sélectionner

select sum ( (~c1 & 1) + (~c2 & 1) ) from tirages;

Pour comprendre allons y pas à pas :

Code : Tout sélectionner

select (~c1 & 1) , (~c2 & 1) from tirages; select (~c1 & 1) + (~c2 & 1) from tirages;
"~" inverse tout les bit de c1
si c1 est pair bit de poid 1 est à 0
"MonInt & 1" donne 1 si bit de poid 1 est 1 (c'est à dire MonInt est impair) .... mais comme on a inversé tout les bit de c1 avec ~ on obtient 1 si c1 est pair et 0 si c1 est impair.
Reste plus qu'à sommer les colonne c1 à c7 pour le nombre de pair par ligne
Reste plus qu'à sommer toutes les lignes
Modifié en dernier par Augure le 02 sept. 2005, 16:56, modifié 1 fois.

Eléphant du PHP | 91 Messages

02 sept. 2005, 16:16

zut .... j'ai créé mon exemple sur SYBASE et MySQL se comporte de faoçn étrange avec l'agrégat SUM et les opérateurs bitwise.

Je vois pour trouver contournement.
Modifié en dernier par Augure le 02 sept. 2005, 16:30, modifié 1 fois.

Eléphant du PHP | 91 Messages

02 sept. 2005, 16:28

Trouvé : sous MySQL

Code : Tout sélectionner

select SUM( MOD(c1+1,2) +MOD(c2+1,2) +MOD(c3+1,2)) from tirages
Et finalement plus simple à lire.

Eléphanteau du PHP | 25 Messages

03 sept. 2005, 12:39

Trouvé : sous MySQL

Code : Tout sélectionner

select SUM( MOD(c1+1,2) +MOD(c2+1,2) +MOD(c3+1,2)) from tirages
Et finalement plus simple à lire.
OK merci, je vais tester

@+