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

SQL Firebird Discussion :

Problème de requete multis-selections


Sujet :

SQL Firebird

  1. #1
    Membre régulier
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2002
    Messages
    213
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juin 2002
    Messages : 213
    Points : 102
    Points
    102
    Par défaut Problème de requete multis-selections
    Salut à tous,

    J'ai un petit problème pour une requête sql, j'ai 2 tables reliées, et je doit faire une recherche en mutli-selections mais ma requete en mono selection fonctionne mais pas en multi, sans doute une astuce que je ne vois pas, seriez vous m'aider? Voila ma requete
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT DISTINCT PROCEDURES.NOM FROM PROCEDURES, ACT_PROC WHERE ACT_PROC.PROCEDUREID=PROCEDURES.ID
     AND PROCEDURES.NOM LIKE 'PRO%' AND ACT_PROC.ACTORID = 4
    AND ACT_PROC.ACTORID = 1;
    mes table sont reliée par l'ID de la table PROCEDURES et par
    PROCEDUREID de la table ACT_PROC si je ne met pas le dernier AND
    pas de problème je récupère les procédure commencant par 'PRO' et qui ont un n° de ACTORID égal à 4 maintenant si c'est possible j'aimerai pouvoir faire une requête me permettant de récupérer le nom des procédures qui commence par PRO et qui ont un n° acteru égal à 4 et à 1 en même temps.

    D'avance merci pour votre aide

  2. #2
    Membre régulier
    Inscrit en
    Avril 2002
    Messages
    70
    Détails du profil
    Informations forums :
    Inscription : Avril 2002
    Messages : 70
    Points : 84
    Points
    84
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    SELECT DISTINCT PROCEDURES.NOM 
      FROM PROCEDURES, ACT_PROC 
     WHERE ACT_PROC.PROCEDUREID=PROCEDURES.ID 
         AND PROCEDURES.NOM LIKE 'PRO%' 
         AND ACT_PROC.ACTORID = 4 
           OR ACT_PROC.ACTORID = 1;
    Ton erreur se situe sur la dernière ligne. Tu dois mettre OR au lieu de AND. Ta requête recherche un champ qui a 4 et 1 en même temps.

    Si tu veux que ta requête soit un peu plus rapide utilise JOIN.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    SELECT DISTINCT PRO.NOM 
      FROM PROCEDURES PRO 
     INNER JOIN ACT_PROC AP ON (AP.PROCEDUREID=PRO.ID)
     WHERE PRO.NOM LIKE 'PRO%' 
         AND AP.ACTORID = 4 
           OR AP.ACTORID = 1;

  3. #3
    Membre régulier
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2002
    Messages
    213
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juin 2002
    Messages : 213
    Points : 102
    Points
    102
    Par défaut
    Merci pour votre réponse,

    Effectivement, maitenant je n'ai plus de messages d'erreurs, mais, parce qu'il y à toujours un mais, mon problème n'est toujours pas résolu.

    En réalité, j'ai un champ de recherche (nom de procedures) et une liste multi-sélections (acteurs), j'ai donc un nom de procédure que je recherche avec mon
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    LIKE 'variable nom proc%'
    et j'ai mon champ multi-selection, que je comptait utiliser
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    AND acteurid ='variable1' AND acteurid = 'variable2'
    ..... (mais ca ne fonctionne pas)

    Seulement avec le OR j'obtient toutes les procédures qui on un acteurid soit de variable1 ou variable2 , .... mais ce que je cherche à faire c'est bien une recherche sur des id qui on des champs identique variable1 et variable2.

    Si vous avez une idée!!!

    D'avance merci.

  4. #4
    Membre régulier
    Inscrit en
    Avril 2002
    Messages
    70
    Détails du profil
    Informations forums :
    Inscription : Avril 2002
    Messages : 70
    Points : 84
    Points
    84
    Par défaut
    Je ne comprends pas vraiment ton problème là.

    Tu veux faire une recherche sur un champ qui à la valeur1 ET la valeur2 ?

  5. #5
    Membre régulier
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2002
    Messages
    213
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juin 2002
    Messages : 213
    Points : 102
    Points
    102
    Par défaut
    j'ai une table ACT_PROC avec 3 champs (ID, ACTORID,PROCEDUREID)
    J'ai une table ACTEURS (ID, NOM) acteurs.id = act_proc.actorid
    une table PROCEDURES (ID,NOM) procedures.id = act_proc.procedureid

    J'aimerai une requete SQL qui me permette de récupérer le nom des procédures qui ont comme acteurs moi ET toi ET lui (et pas les procedures qui moi ou toi ou lui ou ...).

    C'est la que je bloque, soit il me sort aucuns résultat avec le AND soit il m'en sort de trop avec le OR

    la requete que j'avais faite:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT DISTINCT PROCEDURES.NOM FROM PROCEDURES, ACT_PROC WHERE ACT_PROC.PROCEDUREID=PROCEDURES.ID 
    AND PROCEDURES.NOM LIKE 'variable nom procedure%' 
    AND ACT_PROC.ACTORID = variable id acteur rechercher
    AND ACT_PROC.ACTORID = seconde variable acteur;
    Et j'ai fait de même avec à la place du dernier AND un OR mais là la réponse me donne les procédures avec soit l'un soit l'autre soit les deux, mais je ne veux que soit les deux.

    Encore merci de votre patience et de votre aide

  6. #6
    Membre expert
    Avatar de Barbibulle
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    2 048
    Détails du profil
    Informations personnelles :
    Âge : 54
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 2 048
    Points : 3 342
    Points
    3 342
    Par défaut
    Citation Envoyé par Dihap
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    SELECT DISTINCT PROCEDURES.NOM 
      FROM PROCEDURES, ACT_PROC 
     WHERE ACT_PROC.PROCEDUREID=PROCEDURES.ID 
         AND PROCEDURES.NOM LIKE 'PRO%' 
         AND ACT_PROC.ACTORID = 4 
           OR ACT_PROC.ACTORID = 1;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    SELECT DISTINCT PRO.NOM 
      FROM PROCEDURES PRO 
     INNER JOIN ACT_PROC AP ON (AP.PROCEDUREID=PRO.ID)
     WHERE PRO.NOM LIKE 'PRO%' 
         AND AP.ACTORID = 4 
           OR AP.ACTORID = 1;
    Attention aux règles de priorités. Il faut assimiler le AND à un multiplier et le OR à un plus. Ce qui veux dire que ta requete va ramener :
    les noms de procédure commencant par PRO qui ont pour acteur 4
    et les noms de procédure (quelque soit son nom) qui ont pour acteur 1

    Il faut donc mettre des parenthèses :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    SELECT DISTINCT PRO.NOM 
      FROM PROCEDURES PRO 
     INNER JOIN ACT_PROC AP ON (AP.PROCEDUREID=PRO.ID)
     WHERE PRO.NOM LIKE 'PRO%' 
         AND (AP.ACTORID = 4 
           OR AP.ACTORID = 1);
    Cette requete ramène les procédures qui ont un acteur = 1 ou = 4 ET dont le nom de la procédure commence par PRO.


    NB pour tripper.dim

    la clause WHERE permet de selectionner des enregistrements donc pour que l'enregistrement soit retenu il faut que l'ensemble des conditions de la clause where soit vrai. S'il est faut l'enregistrement n'est pas retenu !
    OR
    si tu mets acteur="moi" AND acteur="toi" comment veux tu trouver UN enregistrement (une donnée acteur) qui soit en même temp égale à "moi" et à "toi" ?????
    C'est donc bien un OR qu'il faut utiliser car tu recherches les procédures ayant pour acteur toi OU moi

  7. #7
    Membre régulier
    Inscrit en
    Avril 2002
    Messages
    70
    Détails du profil
    Informations forums :
    Inscription : Avril 2002
    Messages : 70
    Points : 84
    Points
    84
    Par défaut
    Donc si je comprends bien,

    Tu veux sélectionner les champs qui comportent tous les acteurs selon tes critères.

    Dans ta table ACT_PROC, tu peux avoir plusieurs enregistrements avec le même PROCEDUREID qui va déterminer le nombre d'acteurs pour une procédure.

    J'ai bien saisi le problème ?

    P.S. Merci pour la correction pour la requête Baribulle, en effet, j'avais oublié les parenthèse.

  8. #8
    Membre régulier
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2002
    Messages
    213
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juin 2002
    Messages : 213
    Points : 102
    Points
    102
    Par défaut
    Chaque procedure peut avoir 1 ou plusieurs acteurs qui lui est associés.

    Quand je veux faire une recherche par rapport aux acteurs, je donne la possibilité de choisir un ou plusieurs acteurs, ce qui fait que je fait une boucle tantque j'ai des acteurs sélectionné je rajoute à ma requete l'id à rechercher.

    Si exemple une procedure est "en cas d'incendie", les acteurs sont pompiers, police, ambulanciers donc si je selectionne c'est trois acteurs, j'aurais en réponse de ma recherche la procedure "en cas d'incendie", mais si j'ai un procédure "tomber dans les escaliers" et assosicé à acteur ambulanciers, je peux avoir les deux procédures si je sélectionne ambulanciers, mais si je sélectionne les trois acteurs je ne doit pas avoir la procédure "tomber dans les escaliers" puisqu'elle n'est pas valable pour les 3 acteurs en même temps.


  9. #9
    Membre expert
    Avatar de Barbibulle
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    2 048
    Détails du profil
    Informations personnelles :
    Âge : 54
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 2 048
    Points : 3 342
    Points
    3 342
    Par défaut
    Ah tu n'avais pas précisé la multiplicité des acteurs pour un même projet..

    Dans ce cas il faut faire une requete comme celle-ci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SELECT DISTINCT PRO.NOM 
      FROM PROCEDURES PRO 
     INNER JOIN ACT_PROC AP1 ON (AP1.PROCEDUREID=PRO.ID) 
     INNER JOIN ACT_PROC AP2 ON (AP2.PROCEDUREID=PRO.ID) 
     WHERE PRO.NOM LIKE 'PRO%' 
         AND AP1.ACTORID = 4 
         AND AP2.ACTORID = 1;
    Et dans ce cas c'est bien un AND qu'il faut car tu recherches les procédures commencant pas PRO qui ont deux acteurs (1 ET 4)

  10. #10
    Membre régulier
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2002
    Messages
    213
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juin 2002
    Messages : 213
    Points : 102
    Points
    102
    Par défaut
    UN GRAND MERCI A TOUS POUR VOTRE AIDE

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

Discussions similaires

  1. Problème requete SQL SELECT avec access
    Par cactus666 dans le forum Requêtes et SQL.
    Réponses: 2
    Dernier message: 12/12/2007, 12h46
  2. [AJAX] Ajax+Asp, formulaire & select multi-lignes
    Par Baurens dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 27/07/2007, 11h55
  3. [MySQL]Problème de requete select
    Par alex75 dans le forum Langage SQL
    Réponses: 5
    Dernier message: 10/03/2006, 16h45
  4. Problème Requete Multi Jointure + Like
    Par thefutureisnow dans le forum Langage SQL
    Réponses: 27
    Dernier message: 06/01/2006, 15h50
  5. Problème Requete Multi Jointure + Like
    Par thefutureisnow dans le forum Requêtes
    Réponses: 3
    Dernier message: 02/01/2006, 19h39

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