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 :

Recherche multicritères [MySQL]


Sujet :

PHP & Base de données

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Septembre 2009
    Messages : 7
    Par défaut Recherche multicritères
    Bonjour.

    Voici mon problème actuel sur lequel je bug depuis quelques jours.

    Je dispose d'une vue MySQL avec le schéma suivant :

    view_recherche(id_employe, id_ui, id_stage, id_produit, id_niveau, id_type, id_categorie, id_offre, id_typeoffre)

    et j'ai besoin d'effectuer une recherche multi critères (dont le nombre de critères est dynamique) afin par exemple de trouver tous les employés qui on effectué le stage 1 et 2 avec un niveau 3 ... je dois être capable de rechercher sur n'importe quel champs. Le résultat a retourner doit toujours être une liste d'id d'employés + id d'ui.

    On m'a orienté vers les tables dérivées mais elles ne me permettent que de sortir pour un seul critère a chaque fois.

    PS : mes critères arrivent sous forme d'array() via POST, un array correspondant a chaque colonne de la table.

    voila si vous pouvez m'aider merci.

  2. #2
    Membre Expert
    Avatar de Seb33300
    Homme Profil pro
    Développeur Web
    Inscrit en
    Janvier 2007
    Messages
    1 564
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Thaïlande

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 564
    Par défaut
    Quel est ton problème exactement ?

    Car ce que tu demande ne revient qu'a générer une requête avec une clause WHERE

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    SELECT 
       id_employe, 
       id_ui 
    FROM view_recherche 
    WHERE 
       id_stage IN (1,2)
       AND id_niveau IN (3)
       AND ...

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Septembre 2009
    Messages : 7
    Par défaut
    Le problème avec ca c'est qu'il me sort aussi les employés qui n'ont QUE 1 ou QUE 2 ... il faut qu'ils aient les deux obligatoirement pas l'un ou l'autre.

    Par exemple j'ai la recherche suivante :

    Stage : 1
    Niveau : 3

    Stage : 2
    Niveau : 1

    Il devra me sortir les employés ayants effectué le stage 1 de niveau 3 + le stage 2 de niveau 1 et pas seulement l'un des deux.

    J'ai pensé a faire une requête pour chaque critère et a faire un array_intersect() des tableaux que je récupère ensuite en regardant si il y a des employés en commun mais ca me parait lourd alors que ca devrait pouvoir etre fait directement via SQL.

  4. #4
    Membre Expert
    Avatar de Seb33300
    Homme Profil pro
    Développeur Web
    Inscrit en
    Janvier 2007
    Messages
    1 564
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Thaïlande

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 564
    Par défaut
    Ah ok je vois.

    Tu pourrais poster un exemple des array POST que tu récupère ?

    Comment peux tu savoir que le stage 1 va forcement avec le niveau 3 et le stage 2 avec le niveau 1 ?

  5. #5
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Septembre 2009
    Messages : 7
    Par défaut
    alors par exemple

    un print_r($_POST['stage']) me donnerait pour le cas present

    un print_r($_POST['niveau'])
    ...etc

    L'ordre dans les array() etant l'ordre des criteres soit :
    Critere 1 = stage 1 niveau 2
    Critere 2 = stage 3 niveau 1
    ...

    Il peut y avoir plus de lignes dans les array(), il n'y a pas de maximum.

  6. #6
    Membre Expert
    Avatar de Seb33300
    Homme Profil pro
    Développeur Web
    Inscrit en
    Janvier 2007
    Messages
    1 564
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Thaïlande

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 564
    Par défaut
    Une solution pourrait ressembler à ça :
    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
    <?php
    	// Filtres
    	$filtre = "";
    	for($i=0; $i<count($_POST['id_stage']); $i++){
    		if($i > 0){ $filtre .= " OR" }
    		$filtre .= " (1=1";
    		if($_POST['id_stage'][$i] != ""){
    			$filtre .= " AND id_stage=".$_POST['id_stage'][$i];
    		}
    		if($_POST['id_produit'][$i] != ""){
    			$filtre .= " AND id_produit=".$_POST['id_produit'][$i];
    		}
    		// idem pour les autres champs ...
    		$filtre .= ")";
    	}
     
    	$query = mysql_query("SELECT id_employe, id_ui FROM view_recherche WHERE".$filtre);
    ?>

  7. #7
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Septembre 2009
    Messages : 7
    Par défaut
    Oui mais au final c'est la même chose qu'un simple WHERE (OR indique soit l'un soit l'autre et un AND retourne rien du tout a chaque fois car se basant sur la meme ligne), il sort aussi ceux qui n'ont que l'un des deux critères. Je pense vraiment qu'il faut s'orienter du coté des requêtes imbriquées pour essayer de faire via du SQL, mais n'ayant jamais eu a m'en servir je sèche.

    Sinon j'avais donc la possibilité de faire une requête pour chaque critère et de faites des croisements des résultats via array_intersect() mais autant tout faire via SQL si c'est possible.

  8. #8
    Membre Expert
    Avatar de Seb33300
    Homme Profil pro
    Développeur Web
    Inscrit en
    Janvier 2007
    Messages
    1 564
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Thaïlande

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 564
    Par défaut
    Tu as essayé ma solution ?

    ça va sortir une requête qui ressemble à

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    SELECT 
       id_employe, 
       id_ui 
    FROM view_recherche 
    WHERE
       (1=1 AND id_stage=1 AND id_produit=2 AND ...) 
       OR (1=1 AND id_stage=3 AND id_produit=1 AND ...)
       OR ...

    Je en vois pas trop ce qui ne vas pas ?

  9. #9
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Septembre 2009
    Messages : 7
    Par défaut
    Il ne me sort aucun résultat alors que quand je vérifie manuellement dans la vue il y a des correspondances.

    EDIT : il me sort bien des resultats mais comme indiqué au dessus, il sort les gens qui ont fait que l'un ou l'autre en plus de ceux ayant fait les deux. Donc pas bon.

  10. #10
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Septembre 2009
    Messages : 7
    Par défaut
    C'est bon j'ai trouvé une solution c'est plutot special mais ca marche :

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    SELECT 
       id_employe
    FROM view_recherche 
    WHERE
       (1=1 AND id_stage=1 AND id_produit=2 AND ...) 
       OR (1=1 AND id_stage=3 AND id_produit=1 AND ...)
       OR ...
    GROUP BY id_employe
    HAVING count(*) = 2

    2 étant le nombre de critères, je perd juste l'ui au passage mais pas vraiment grave.

    Merci de m'avoir indiqué le chemin

  11. #11
    Membre Expert
    Avatar de Seb33300
    Homme Profil pro
    Développeur Web
    Inscrit en
    Janvier 2007
    Messages
    1 564
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Thaïlande

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 564
    Par défaut
    Dans

    Critere 1 = stage 1 niveau 2
    Critere 2 = stage 3 niveau 1


    Ils faut les gens qui correspondent aux critères 1 et 2 mais pas ceux qui sont dans un des deux ?

    Si c'est le cas j'avais mal compris et il faudrait faire :
    Code php : 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
    <?php
    	// Filtres
    	$filtre = "";
    	for($i=0; $i<count($_POST['id_stage']); $i++){
    		if($i > 0){ $filtre .= " AND" }
    		$filtre .= "id_employe IN (SELECT id_employe FROM view_recherche WHERE 1=1";
    		if($_POST['id_stage'][$i] != ""){
    			$filtre .= " AND id_stage=".$_POST['id_stage'][$i];
    		}
    		if($_POST['id_produit'][$i] != ""){
    			$filtre .= " AND id_produit=".$_POST['id_produit'][$i];
    		}
    		// idem pour les autres champs ...
    		$filtre .= ")";
    	}
     
    	$query = mysql_query("SELECT id_employe, id_ui FROM view_recherche WHERE".$filtre);
    ?>

  12. #12
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Septembre 2009
    Messages : 7
    Par défaut
    Voila c'est tout a fait ca. Merci pour ton aide en fait je cherchais trop compliqué ^^.

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

Discussions similaires

  1. faire un état d'après recherche multicritère
    Par bilouk dans le forum Access
    Réponses: 4
    Dernier message: 12/01/2006, 19h30
  2. Formulaire Recherche MultiCritère et RunTime
    Par fbu78 dans le forum Runtime
    Réponses: 9
    Dernier message: 06/01/2006, 18h52
  3. Recherche multicritère
    Par Darlay Jean_Louis dans le forum Access
    Réponses: 2
    Dernier message: 26/10/2005, 10h54
  4. Réponses: 2
    Dernier message: 01/10/2005, 19h42
  5. recherche multicritères
    Par onlineduel dans le forum Débuter
    Réponses: 3
    Dernier message: 30/03/2004, 17h15

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