Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1134 connectés 

  FORUM HardWare.fr
  Programmation
  PHP

  php-mysql c pas possible les sous-requetes ?

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

php-mysql c pas possible les sous-requetes ?

n°297728
hao
Posté le 31-01-2003 à 10:00:22  profilanswer
 

bonjour a tous,
j'ai un pb avec une requete:
select nMembre from membre where 1 and nMembre in( select nMembre from encadre where 1);
 
ne me dites pas qu'on peut faire ca avec une jointure simple, la requete est bcp plus longue, mais c le coup du ...in(select... qui marche pas.

mood
Publicité
Posté le 31-01-2003 à 10:00:22  profilanswer
 

n°297763
dropsy
et bonne chance surtout...
Posté le 31-01-2003 à 10:40:08  profilanswer
 

il me semble que les sous requêtes ne sont supportées qu'à partir du dernier mysql (sorti il y a qques jours je crois).
 
edit: cf http://forum.hardware.fr/forum2.ph [...] subcat=395


Message édité par dropsy le 31-01-2003 à 10:41:32
n°297791
weed
Posté le 31-01-2003 à 11:37:12  profilanswer
 

arf ca c bon a savoir
Hao pq mets tu where 1  
je trouves ca inutile meme si il le mette ds phpmyadmin  

n°298674
hao
Posté le 01-02-2003 à 09:32:24  profilanswer
 

@weed:
 
le but de cette requete, c qu'elle se construise au fur et a mesure.
donc au debut "select.....where 1"
et puis apres: requete=requete." and nom like \"toto\"";
par exemple.et ainsi de suite

n°299239
weed
Posté le 01-02-2003 à 22:20:12  profilanswer
 

merci Hao pour mais en fait je connais les sous interrogations et les jointures simple, auto et .....
 
ma question est pourquoi tu fais comme phpmyadmin qui met a chaque fois un where 1 ce qui est inutile pour moi ...
 
select nMembre from membre where nMembre in( select nMembre from encadre);  
 
sinon ds ta requete étant tres longue tu n'oses pas trop faire une jointure, bizzare ms c vrai que l'on m'a dit que le must etait de faire des sous interrogation chose car plus puissant que les jointures ms j'aime pas trop ....
dc en fait cela comfirme ce que j'ai entendu, c un peu plus court en sous interrogation ....  
 

n°300189
hao
Posté le 03-02-2003 à 15:35:22  profilanswer
 

bon, pour résumer voila un morceau du code, essaie de voir ce que ca donnerait sans 'where 1' :
 
 $requete = "select * from membre where 1";
 if($anneeArrivee != null)
  $requete = $requete." and anneeArrivee = \"$anneeArrivee\"";
   
 if($nom != null)
  $requete = $requete." and nom like \"%$nom%\"";
   
 if($prenom != null)
  $requete = $requete." and prenom like \"%$prenom\"%";
 
 if($age != null)
  $requete = $requete." and age = \"$age\"";
   
 if($adresse != null)
  $requete = $requete." and adresse like  \"%$adresse%\"";
 
 
 
etc.....


Message édité par hao le 03-02-2003 à 15:36:10
n°300729
weed
Posté le 04-02-2003 à 10:28:17  profilanswer
 

je ne comprends pas trop stript  
je repose ma question qu'est que ca change un where 1
parce que la clause WHERE permet de faire une selection  
c tt du moins ce que j'ai appris

n°300757
dropsy
et bonne chance surtout...
Posté le 04-02-2003 à 11:09:23  profilanswer
 

weed a écrit :

je ne comprends pas trop stript  
je repose ma question qu'est que ca change un where 1
parce que la clause WHERE permet de faire une selection  
c tt du moins ce que j'ai appris


 
si tu ne rentres dans aucun if, tu as qd même une requête valide et réciproquement, si tu rentres dans un if (n'importe lequel) tu as aussi une requête valide


Message édité par dropsy le 04-02-2003 à 11:11:00
n°300825
hao
Posté le 04-02-2003 à 12:39:34  profilanswer
 

c le mot d'ordre SELECT qui fait la selection
where est la pour imposer des contraintees sur les resultats du select
and ca fait pareil, ca rajoute des conditions, mais faut avaoir fait un where avant
reprend le code du dessus sans le where et essaie devierses possiblites, tu verras ca marchera jamais

n°300831
Mara's dad
Yes I can !
Posté le 04-02-2003 à 13:28:53  profilanswer
 

Heu, un exemple sans "where=1" !
 
Et qui permet d'ajouter des champs sans recopier des lignes de codes qui font la même chose  ;)  
 

Code :
  1. $champ[] = "anneeArrivee";
  2. $champ[] = "nom";
  3. $champ[] = "prenom";
  4. $champ[] = "age";
  5. $champ[] = "adresse";
  6. $where = "";
  7. for( $i=0; $i<count($champ); $i++ )
  8. {
  9. if( $$champ[$i] != null )
  10. {
  11.  if( empty( $where ) )
  12.   $where = "where ";
  13.  else
  14.   $where .= " and ";
  15.  $were . = "$champ[$i] ) \"" . $$champ[$i] . "\"";
  16. }
  17. }
  18. $requete = "select * from membre $where";


 
C'est un exemple, hein.
A adapter si besoin...


---------------
Laissez l'Etat dans les toilettes où vous l'avez trouvé.
mood
Publicité
Posté le 04-02-2003 à 13:28:53  profilanswer
 

n°300878
hao
Posté le 04-02-2003 à 13:55:12  profilanswer
 

deja qu'en php le code c le bordel, je trouve que ca alourdit pas mal. sinon ca marche, mais ca revient au meme :)

n°300986
Mara's dad
Yes I can !
Posté le 04-02-2003 à 15:11:45  profilanswer
 

Arrête tout de suite le PHP :heink:


---------------
Laissez l'Etat dans les toilettes où vous l'avez trouvé.
n°301206
hao
Posté le 04-02-2003 à 17:12:16  profilanswer
 

:??:
 
les pages qui font 3k lignes, avec du html a printer dedans qui donne un truc super mal indenté c qd meme UN PEU plus le bordel qu'un truc oo...


Message édité par hao le 04-02-2003 à 17:12:37
n°301226
Sh@rdar
Ex-PhPéteur
Posté le 04-02-2003 à 17:26:26  profilanswer
 

c'est pas parce que tu fais du php que t'es obligé de bosser comme un porc hein..
 
eh puis rien ne t'empêche de faire ton php en objet :heink:


---------------
La musique c'est comme la bouffe, tu te souviens du restaurant dans lequel t'as bien mangé 20 ans plus tôt, mais pas du sandwich d'il y a 5 minutes :o - Plugin pour winamp ©Harkonnen : http://harko.free.fr/soft
n°301254
Mara's dad
Yes I can !
Posté le 04-02-2003 à 17:54:29  profilanswer
 

Hao a écrit :

:??:
 
les pages qui font 3k lignes, avec du html a printer dedans qui donne un truc super mal indenté c qd meme UN PEU plus le bordel qu'un truc oo...


 
 
Tiens, voilà un bout de code en cous de dev.
 
C'est une méthode d'un objet qui sert à gérer des requêtes quasiement créés dynamiquement par l'utilisateur.
 

Code :
  1. // Génération de la requete SQL.
  2. function gen_sql()
  3. {
  4.  // Opérateurs utilisables en fonction du type de donnée.
  5.  // Dans les chaînes, l'@' doit être remplacé par le nom du champs, et le '$' par la valeur s'il y a lieu.
  6.  $aOperateurs = array( "text" => array(  "EQ" => "@ = '$'",
  7.             "N-EQ" => "@ != '$'",
  8.            "INF" => "@ < '$'",
  9.            "INF-EQ" => "@ <= '$'",
  10.            "SUP" => "@ > '$'",
  11.            "SUP-EQ" => "@ >= '$'",
  12.            "NULL" => "@ IS NULL",
  13.            "N-NULL" => "@ IS NOT NULL" ,
  14.            "BEGIN" => "@ LIKE '$%'",
  15.            "LIKE" => "@ LIKE '%$%'",
  16.            "N-LIKE" => "@ NOT LIKE '%$%'" ),
  17.        "nombre" => array( "EQ" => "@ = $",
  18.            "N-EQ" => "@ != $",
  19.            "INF" => "@ < $",
  20.            "INF-EQ" => "@ <= $",
  21.            "SUP" => "@ > $",
  22.            "SUP-EQ" => "@ >= $",
  23.            "NULL" => "@ IS NULL",
  24.            "N-NULL" => "@ IS NOT NULL" ),
  25.        "date" => array( "EQ" => "TO_CHAR( @, 'YYYYMMDD' ) = '$'",
  26.            "INF-EQ" => "TO_CHAR( @, 'YYYYMMDD' ) <= '$'",
  27.            "SUP" => "TO_CHAR( @, 'YYYYMMDD' ) > '$'",
  28.            "SUP-EQ" => "TO_CHAR( @, 'YYYYMMDD' ) >= '$'" ) );
  29.  // On commence par le tronc
  30.  $query = $this->sql;
  31.  // Flag pour premier critère
  32.  $first = true;
  33.  // Chaque critère est pris en compte s'il est valorisé, c'est à dire si une condition éxiste dessus.
  34.  foreach( $this->aCriteres as $key => $value )
  35.  {
  36.   if( $value['valorise'] )
  37.   {
  38.    // Cas du premier critère
  39.    if( $first )
  40.    {
  41.     $query .= " WHERE ";
  42.     $first = false;
  43.    }
  44.    else
  45.    {
  46.     $query .= " AND ";
  47.    }
  48.    // Récupération de la valeur
  49.    $valeur = $value['valeur'];
  50.    // Si le champ est une date, c'est un objet oDate et non une chaîne.
  51.    if( $value['type'] == "date" )
  52.    {
  53.     // Donc il faut récupérer la valeur chaîne de la date dans le format AAAAMMJJ pour pouvoir faire des comparaisons.
  54.     $valeur = $value['valeur']->toDB();
  55.    }
  56.    // Récupération de la chaîne de comparaison en fonction du type et de l'opérateur.
  57.    if( isset( $aOperateurs[$value['type']][$value['operateur']] ) )
  58.    {
  59.     // On remplace l'@' par le nom du champ dans la chaîne de comparaison  
  60.     $comparaison = str_replace( "@", $key, $aOperateurs[$value['type']][$value['operateur']] );
  61.     // On remplace le '$' par la valeur du champ dans la chaîne de comparaison  
  62.     $comparaison = str_replace( "$", $valeur, $comparaison );
  63.    }
  64.    else
  65.    {
  66.     message( "ERR_CNTX_OPER", array( "champ"=>$key, "type"=>$value['type'], "operateur"=>$value['operateur'] ) );
  67.     return false;
  68.    }
  69.    $query .= $comparaison;
  70.   }
  71.  }
  72.  // Flag pour premier ordre de tri
  73.  $first = true;
  74.  // On tri le tableau des tris dans l'ordre des 'ordre'. (Trop fort ! ! !)
  75.  array_multisort( $this->aTris, SORT_ASC );
  76.  // Chaque tri est pris en compte s'il est utilisé, c'est à dire si son ordre est > 0.
  77.  foreach( $this->aTris as $key => $value )
  78.  {
  79.   if( $value['ordre'] > 0 )
  80.   {
  81.    // Cas du premier critère
  82.    if( $first )
  83.    {
  84.     $query .= " ORDER BY ";
  85.     $first = false;
  86.    }
  87.    else
  88.    {
  89.     $query .= ", ";
  90.    }
  91.    $query .= "$key {$value['sens']}";
  92.   }
  93.  }
  94.  return $query;
  95. }


---------------
Laissez l'Etat dans les toilettes où vous l'avez trouvé.
n°301561
weed
Posté le 04-02-2003 à 23:35:24  profilanswer
 

Mara's dad  
je suis un peu curieux, ms ne m'en veux pas, je suis pas tres bon en PHP je connais assez bien la POO avec le C++
 
tu parles de methoses, ms la tu n'as pas encore construits ta classe, si je me trompes pas ???
 
et en 3 mots ce morceaux que te permet t'il ??? esplique moi avec un exemple pour que ce soit plus facile à m'expliquer ...

n°301903
Mara's dad
Yes I can !
Posté le 05-02-2003 à 01:41:02  profilanswer
 

C'est une méthode isolée, sortie de son contexte...
 
Justement, la classe en question (qu'on ne voit pas dans ce court extrait) sert à stocker le contexte d'une page.
 
Dans ce contexte, on trouve des requetes SQL qui sont composées d'un corp (select blabla...from...), de critères (les clauses du where, et d'ordres de tri pour l'ORDRE BY.
 
Certain critères peuvent être modifiés par l'utilisateur pour affiner sa recherche, certains sont obligatoires, d'autres non...
Pareil pour les ordres de tri.
 
La méthode présentée permet de reconstruire les requêtes à partir des élements de description (corp, critères, tris) et des données du contexte stocké en session. ( Les données viennent d'un formulaire. Elles sont controlées avant d'être stockées en cession dans des contextes )
 
Sur le formualire présenté à l'utilisateur, il y a une liste des champs sur lesquels il peux faire des sélections et ou des tris.
En fonction du type de donnée de chaque champ, les opérateurs de comparaisons possibles sont présentés dans des listes déroulantes. Le tableau $aOperateurs sert à constituer les partie des clauses where en fonction des types de champs et de l'opérateur choisi.
 
Ce bout de code n'est qu'une infime partie d'un moteur qui génère des pages à partir d'une description XML des objets à afficher (champ, liste, sélecteur de donnée, images, textes...).
Les données sont lue (en XML) à partir de bases Oracle ou PostgreSql et fusionnées avec des XSL pour générer au choix des pages web ou des éditions PDF.
 
Tout çà pour montrer que la génération de requête dynamiques n'impose pas de mettre des "where 1" à tout bout de champs, même sur un projet important illustré par le bout de code :

Code :
  1. // Cas du premier critère  
  2. if( $first )
  3. {
  4.    $query .= " WHERE ";
  5.    $first = false;
  6. }
  7. else
  8. {
  9.    $query .= " AND ";
  10. }


 
En fait, on a le même problème pour la clause 'ORDER BY'
 
Comment fait Hao pour mettre un 'ORDRE BY' par défaut s'il en  propose qui sont facultatifs ?
Surtout qu'il peut aussi être intéressant de laisser l'itilisateur choisir l'odre d'application des ordres de tri :D  
 

Code :
  1. // On tri le tableau des tris dans l'ordre des 'ordre'. (Trop fort ! ! !)  
  2. array_multisort( $this->aTris, SORT_ASC );


 
A+


---------------
Laissez l'Etat dans les toilettes où vous l'avez trouvé.

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  PHP

  php-mysql c pas possible les sous-requetes ?

 

Sujets relatifs
Envoyer un mail avec un dump de base mySQL en pièce jointe[PHP MySQL] divers problemes de tres bas nivo
pb requête MySQL Help !!![SQL] comment on fait des requetes du type coli = coli+5
[MySQL] et PHPMyAdmin[mysql] comment creer une base de donnée ?
[MySQL] controle de diffusion par: contrainte ou vue ???[Php/MySQL] Éviter les doublons .
securite avec php/mysql/apache[PHP/MySQL ] Classement par lettre
Plus de sujets relatifs à : php-mysql c pas possible les sous-requetes ?


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR