IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

PHP & Base de données Discussion :

syntaxe requete multicriteres


Sujet :

PHP & Base de données

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé

    Profil pro
    Pompier
    Inscrit en
    Janvier 2010
    Messages
    391
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Pompier

    Informations forums :
    Inscription : Janvier 2010
    Messages : 391
    Par défaut syntaxe requete multicriteres
    bonjour,
    je ne sais pas si je poste au bon endroit ; si ce n'est pas le cas désolé.

    Voilà mon problème.
    J'ai 2 tables

    RH_personnel: matricule(num) centre1(num) centre2(num)
    Decla_dispo: matricule(num) date(date) centre(num)

    1 agent peut appartenir à 2 centres
    ce même agent por la même journée peut déclarer de la disponibilité pour chaque centre.

    ex: agent: 1212 centre1: 300 centre 2: 304
    agent 5555 centre1:304
    agent 9999 centre1:304 centre2: 313

    Decla_dispo 1212 date:11/07/2012 centre: 304
    Decla_dispo 5555 date:11/07/2012 centre: 304

    Ce que je voudrais, c'est afficher en fonction de la valeur du centre,
    le nom de tous les agents appartenant au centre et en face une croix s'ils ont déclaré de la dispo.

    Dans l'exemple pour le centre 304

    Que ce soit en php ou via access, je n'arrive pas à la solution.
    Merci d'avance

  2. #2
    Membre éclairé

    Profil pro
    Pompier
    Inscrit en
    Janvier 2010
    Messages
    391
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Pompier

    Informations forums :
    Inscription : Janvier 2010
    Messages : 391
    Par défaut
    J'ai une idée de processus, mais je ne sais pas comment le mettre en place.
    La base access me sert de base de donnée et formulaire php pour visualiser.

    1ère étape: Selectionner tous les agents du centre:

    soit $centre=valeur du centre

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    $sqlcentre="SELECT * FROM RH_personnel WHERE centre1=".$centre." OR centre2=".$centre.";
    avec l'exemple j'ai pour centre=304 => matricule= 1212 ; 5555; 9999

    2ème étape: Selectionner les agents ayants déclaré de la disponibilité pour la date et le centre

    Création de Recape_dispo= matricule date(=DATE) centre centre1 centre2
    soit $D=DATE

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    $sqldispocentre="SELECT * FROM Recape_dispo WHERE centre1=".$centre." AND centre=".$centre." OR centre2=".$centre." AND centre="$.centre."
    avec l'exemple j'ai pour centre=304 => 1212; 5555

    Comment faire apparaitre

    1212 -> X
    5555 -> X
    9999 ->

  3. #3
    Membre éclairé

    Profil pro
    Pompier
    Inscrit en
    Janvier 2010
    Messages
    391
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Pompier

    Informations forums :
    Inscription : Janvier 2010
    Messages : 391
    Par défaut
    apres recherche, j'ai réussi cette requête

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    $sqltest = "SELECT RH_personnel.nom, RH_personnel.matricule, RH_personnel.centre1,  test.A
     FROM RH_personnel LEFT JOIN Test ON RH_personnel.matricule=test.matricule 
    WHERE RH_personnel.centre1=".$centre."  OR RH_personnel.centre2=".$centre."  
    ORDER BY nom " ;
     
     $cnx = odbc_connect( "DSN_disponibilite", "root", "" ) or die ("Impossible de se connecter à la base de donnée") ;
        //exécution de la requête:
        $requettest = odbc_do($cnx, $sqltest) ;
       while( $resulttest = odbc_fetch_object( $requettest ) )
        { 
     
    	$nomt=$resulttest->nom;
    	$A=$resulttest->A;
    	$centre1=$resulttest->centre1;
     
           echo("<div align=\"left\"> " .$nomt." " .$A." " .$centre1." </a><br>\n") ;
     
        }
    Reprenons l'exemple:
    agent: 1212 centre1: 300 centre 2: 304
    agent 5555 centre1:304
    agent 9999 centre1:304 centre2: 313
    agent 2222 centre1: 310 centre 2: 304


    Decla_dispo 1212 date:11/07/2012 centre: 304
    Decla_dispo 5555 date:11/07/2012 centre: 304
    Decla_dispo 2222 date:11/07/2012 centre: 310

    Avec la requete, ca donne
    1212 -> X
    5555 -> X
    9999 ->
    2222 -> X

    J'ai tourné la requete dans tous les sens. Si je mets

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    $sqltest = "SELECT RH_personnel.nom, RH_personnel.matricule, RH_personnel.centre1,  test.A
     FROM RH_personnel LEFT JOIN Test ON RH_personnel.matricule=test.matricule 
    WHERE RH_personnel.centre1=".$centre." AND test.centre=".$centre." OR RH_personnel.centre2=".$centre."  AND test.centre=".$centre." 
    ORDER BY ... " ;
    J'ai en resultat

    1212 -> X
    5555 -> X

    HELPPPPPPPPPPPPP ME

  4. #4
    Membre éclairé

    Profil pro
    Pompier
    Inscrit en
    Janvier 2010
    Messages
    391
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Pompier

    Informations forums :
    Inscription : Janvier 2010
    Messages : 391
    Par défaut
    YOUPIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII j'ai trouvé SEUL

    En fait, la solution ne résidait pas dans la requete mais dans la façon de l'afficher.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    <?php
    $sqltest = "SELECT RH_personnel.nom, RH_personnel.matricule, RH_personnel.centre1, RH_personnel.centre2, test.A, test.centre
     FROM RH_personnel LEFT JOIN Test ON RH_personnel.matricule=test.matricule 
    WHERE RH_personnel.centre1=".$centre."  OR RH_personnel.centre2=".$centre." 
     ORDER BY nom " ;
     
    	// echo "".$sqldecla."";
        $cnx = odbc_connect( "DSN_disponibilite", "root", "" ) or die ("Impossible de se connecter à la base de donnée") ;
        //exécution de la requête:
        $requettest = odbc_do($cnx, $sqltest) ;
       while( $resulttest = odbc_fetch_object( $requettest ) )
        { 
     
    	$nomt=$resulttest->nom;
    	$A=$resulttest->A;
    	$centre1=$resulttest->centre1;    //valeur du centre1
    	$centre2=$resulttest->centre2;    //valeur du centre2
    	$centre3=$resulttest->centre;     //valeur du centre de la declaration
     ?>
        <table>
     
        <?php
     
    // je traite les égalités
    	if ((($centre1==$centre) AND ($centre3==$centre)) OR (($centre2==$centre) AND ($centre3==$centre))){
     
    //Affichage si OK -> X
     ?> <tr><td height="20" width="162"> <?php
           echo(" <div align=\"left\"> " .$nomt." </a><br>\n  ")  ;?></td><td width="48"> <?php echo(" <div align=\"right\">  X </a><br>\n  ")  ; ?></td></tr> <?php }
     
    //Affichage si pas OK ->
    	   else { ?> <tr><td height="20" width="162"> <?php
           echo(" <div align=\"left\"> " .$nomt." </a><br>\n  ")  ;?></td><td> <?php echo(" <div align=\"left\">   </a><br>\n  ")  ; ?></td></tr> <?php }
     
        }
    	 ?></table>
    Oui c'est un post en monologue et alors???
    VOTEZ POUR MOI SVP lol

  5. #5
    Membre éclairé

    Profil pro
    Pompier
    Inscrit en
    Janvier 2010
    Messages
    391
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Pompier

    Informations forums :
    Inscription : Janvier 2010
    Messages : 391
    Par défaut
    EN fait ça ne fonctionne pas ma requete avec cette affichage.



    Il faudrait que dès la requête j'arrive à seclectionner pour cette condition:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    WHERE
           (($centre1==$centre) AND ($centre3==$centre))
     OR (($centre2==$centre) AND ($centre3==$centre))
    Quand je le met ça me selectionne que 2 agents et je perds le bénéfice du LEFT INNER

    Peut-être faut-il tourner le problème dans un autre sens?
    Merci pour votre aide

  6. #6
    Expert confirmé
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 142
    Billets dans le blog
    12
    Par défaut
    Salut,

    A première vue, tu t'es raté dans le design de ta table Rh_Personnel. C'est pour ça que tu rames autant...
    Tu n'aurais jamais dû mettre tes champs centre1 et centre2 dans cette table.
    Tu aurais dû créer une table t_affectation(#id, id_rh, id_centre) et gérer de manière indépendante cette information. Si demain, le personnel peut se retrouver affecté à 3 centres tu feras comment ? Galère, galère
    Un design de base de données bancal et tu passes à la caisse illico.
    Faut le faire avec le plus grand soin et garder sous le coude des cas d'utilisations tordus histoire de voir si tout rentre et ressort sans perdre trop de cheveux...

    En SQL tu as la possibilité de faire un UNION entre deux requête pourvu qu'elles ramènent les même champs. Dans ton cas, cela pourrait donner :
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    SELECT 
        RH_personnel.nom, 
        RH_personnel.matricule, 
        RH_personnel.centre1 AS centre,
        t_dispo.date_ AS date_dispo
    FROM 
        RH_personnel 
            LEFT JOIN t_dispo ON RH_personnel.matricule = t_dispo.matricule 
    WHERE 
        RH_personnel.centre1 = "$centre" 
        AND t_dispo.date_ = "$ta_date" 
     
    UNION
     
    SELECT 
        RH_personnel.nom, 
        RH_personnel.matricule, 
        RH_personnel.centre2 AS centre,
        t_dispo.date_  AS date_dispo
    FROM 
        RH_personnel 
            LEFT JOIN t_dispo ON RH_personnel.matricule = t_dispo.matricule 
    WHERE 
        RH_personnel.centre2 = "$centre" 
        AND t_dispo.date_ = "$ta_date"

    C'est une piste à explorer, ne reste plus qu'à retravailler tout ça au rendu.
    Si une donnée est présente dans date_dispo, tu peux mettre une croix à la place et le tour est joué

  7. #7
    Membre éclairé

    Profil pro
    Pompier
    Inscrit en
    Janvier 2010
    Messages
    391
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Pompier

    Informations forums :
    Inscription : Janvier 2010
    Messages : 391
    Par défaut
    j'ai essayer mais je comprend pas tout. En tout cas c'est qympa de ta part.

    est-il possible de faire quelquechose du style
    1 requete qui selectionne les agents du centre selectionné
    1 requete qui selectione les agents du centre qui ont déclaré de la dispo
    lier les deux requetes pour avoir un tableau:
    matricule.RH_personnel, decla_dispo.DECLA= oui ou vide

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
     
     
    $sql="SELECT * FROM RH_personnel 
     
    FROM 
    RH_personnel 
            LEFT JOIN decla_dispo ON RH_personnel.matricule  = decla_dispo.matricule
     
    WHERE centre1=".$centre." OR centre2=".$centre."        // je selectionne les agents pour le centre selectionné
     
    UNION
     
    SELECT * FROM 
    RH_personnel 
            LEFT JOIN decla_dispo ON RH_personnel.matricule  = decla_dispo.matricule
     
    WHERE centre=".$centre."";
                              // je selectionne les agents pour le centre ayant delaré la dispo
    Je ne sais pas si les LEFT JOIN sont utiles ni justement comment faire une sorte de:

    SELECT * From requete1
    LEFT JOIN requete2 ON matricule.requete1=matricule.requete2

  8. #8
    Expert confirmé
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 142
    Billets dans le blog
    12
    Par défaut
    Tu as dis que tes données étaient gérées dans une base MSAccess, ce que tu pourrais faire c'est faire une requête avancée UNION dans Access dans un premier temps. Cela permettrait de voir si les données récupérées tiennent la route.
    Mon sql n'est pas correct.
    Je fais un essai et je reviens

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. syntaxe requete avec parametres
    Par mike600river dans le forum C++Builder
    Réponses: 5
    Dernier message: 24/05/2006, 17h03
  2. syntaxe requete VB
    Par fscli dans le forum Access
    Réponses: 13
    Dernier message: 15/05/2006, 12h04
  3. [postgres][vb.net][sql]syntaxe requete ajout
    Par Alex35 dans le forum Langage SQL
    Réponses: 1
    Dernier message: 27/10/2005, 11h55
  4. explication syntaxe requete sur pgsql
    Par alain.lc dans le forum PostgreSQL
    Réponses: 2
    Dernier message: 08/12/2004, 10h24
  5. Syntaxe requete
    Par Chipolata dans le forum Langage SQL
    Réponses: 2
    Dernier message: 28/03/2003, 14h22

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo