Précédent   Forum des professionnels en informatique > Bases de données > Firebird > SQL
SQL Forum d'entraide sur le SQL pour Firebird
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 02/09/2003, 10h32   #1
Membre du Club
 
Homme
Ingénieur développement logiciels
Inscription : juin 2002
Messages : 163
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 37
Localisation : Belgique

Informations professionnelles :
Activité : Ingénieur développement logiciels

Informations forums :
Inscription : juin 2002
Messages : 163
Points : 52
Points : 52
Envoyer un message via ICQ à tripper.dim Envoyer un message via AIM à tripper.dim Envoyer un message via MSN à tripper.dim Envoyer un message via Yahoo à tripper.dim Envoyer un message via Skype™ à tripper.dim
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 :
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
tripper.dim est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/09/2003, 14h10   #2
Membre régulier
 
Inscription : avril 2002
Messages : 70
Détails du profil
Informations forums :
Inscription : avril 2002
Messages : 70
Points : 77
Points : 77
Code :
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 :
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;
Dihap est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/09/2003, 14h58   #3
Membre du Club
 
Homme
Ingénieur développement logiciels
Inscription : juin 2002
Messages : 163
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 37
Localisation : Belgique

Informations professionnelles :
Activité : Ingénieur développement logiciels

Informations forums :
Inscription : juin 2002
Messages : 163
Points : 52
Points : 52
Envoyer un message via ICQ à tripper.dim Envoyer un message via AIM à tripper.dim Envoyer un message via MSN à tripper.dim Envoyer un message via Yahoo à tripper.dim Envoyer un message via Skype™ à tripper.dim
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 :
LIKE 'variable nom proc%'
et j'ai mon champ multi-selection, que je comptait utiliser
Code :
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.
tripper.dim est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/09/2003, 15h16   #4
Membre régulier
 
Inscription : avril 2002
Messages : 70
Détails du profil
Informations forums :
Inscription : avril 2002
Messages : 70
Points : 77
Points : 77
Je ne comprends pas vraiment ton problème là.

Tu veux faire une recherche sur un champ qui à la valeur1 ET la valeur2 ?
Dihap est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/09/2003, 15h36   #5
Membre du Club
 
Homme
Ingénieur développement logiciels
Inscription : juin 2002
Messages : 163
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 37
Localisation : Belgique

Informations professionnelles :
Activité : Ingénieur développement logiciels

Informations forums :
Inscription : juin 2002
Messages : 163
Points : 52
Points : 52
Envoyer un message via ICQ à tripper.dim Envoyer un message via AIM à tripper.dim Envoyer un message via MSN à tripper.dim Envoyer un message via Yahoo à tripper.dim Envoyer un message via Skype™ à tripper.dim
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 :
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
tripper.dim est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/09/2003, 16h24   #6
Membre Expert
 
Avatar de Barbibulle
 
Frédéric
Inscription : octobre 2002
Messages : 1 722
Détails du profil
Informations personnelles :
Nom : Frédéric
Âge : 42

Informations forums :
Inscription : octobre 2002
Messages : 1 722
Points : 2 025
Points : 2 025
Citation:
Envoyé par Dihap
Code :
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 :
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 :
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
Barbibulle est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/09/2003, 16h51   #7
Membre régulier
 
Inscription : avril 2002
Messages : 70
Détails du profil
Informations forums :
Inscription : avril 2002
Messages : 70
Points : 77
Points : 77
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.
Dihap est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/09/2003, 17h16   #8
Membre du Club
 
Homme
Ingénieur développement logiciels
Inscription : juin 2002
Messages : 163
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 37
Localisation : Belgique

Informations professionnelles :
Activité : Ingénieur développement logiciels

Informations forums :
Inscription : juin 2002
Messages : 163
Points : 52
Points : 52
Envoyer un message via ICQ à tripper.dim Envoyer un message via AIM à tripper.dim Envoyer un message via MSN à tripper.dim Envoyer un message via Yahoo à tripper.dim Envoyer un message via Skype™ à tripper.dim
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.

tripper.dim est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/09/2003, 17h40   #9
Membre Expert
 
Avatar de Barbibulle
 
Frédéric
Inscription : octobre 2002
Messages : 1 722
Détails du profil
Informations personnelles :
Nom : Frédéric
Âge : 42

Informations forums :
Inscription : octobre 2002
Messages : 1 722
Points : 2 025
Points : 2 025
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 :
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)
Barbibulle est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/09/2003, 13h08   #10
Membre du Club
 
Homme
Ingénieur développement logiciels
Inscription : juin 2002
Messages : 163
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 37
Localisation : Belgique

Informations professionnelles :
Activité : Ingénieur développement logiciels

Informations forums :
Inscription : juin 2002
Messages : 163
Points : 52
Points : 52
Envoyer un message via ICQ à tripper.dim Envoyer un message via AIM à tripper.dim Envoyer un message via MSN à tripper.dim Envoyer un message via Yahoo à tripper.dim Envoyer un message via Skype™ à tripper.dim
UN GRAND MERCI A TOUS POUR VOTRE AIDE
tripper.dim est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 12h52.


 
 
 
 
Partenaires

Hébergement Web