Page 1 sur 1
Requetes de selection a simplifier
Posté : 02 sept. 2005, 09:54
par Jeanmi
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
Posté : 02 sept. 2005, 09:57
par ouckileou
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(*)
Posté : 02 sept. 2005, 10:05
par Invité
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
Posté : 02 sept. 2005, 10:09
par ouckileou
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'];
Posté : 02 sept. 2005, 10:16
par jherrgot
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 ??
Posté : 02 sept. 2005, 10:21
par ouckileou
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
Posté : 02 sept. 2005, 10:28
par jherrgot
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 ???
Posté : 02 sept. 2005, 10:36
par ouckileou
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
Posté : 02 sept. 2005, 10:44
par jherrgot
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
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 ???
@+
Posté : 02 sept. 2005, 16:08
par Augure
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 :
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
Posté : 02 sept. 2005, 16:16
par Augure
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.
Posté : 02 sept. 2005, 16:28
par Augure
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.
Posté : 03 sept. 2005, 12:39
par jherrgot
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
@+