Requetes de selection a simplifier

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : Requetes de selection a simplifier

par jherrgot » 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

@+

par Augure » 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.

par Augure » 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.

par Augure » 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

par jherrgot » 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 ???

@+

par ouckileou » 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

par jherrgot » 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 ???

par ouckileou » 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

par jherrgot » 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 ??

par ouckileou » 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'];

par Invité » 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

par ouckileou » 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(*)

Requetes de selection a simplifier

par Jeanmi » 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