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

  FORUM HardWare.fr
  Programmation
  SQL/NoSQL

  Requête qui cherche plusieurs valeurs simultanément

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Requête qui cherche plusieurs valeurs simultanément

n°1179282
Inekman
Posté le 19-08-2005 à 03:00:54  profilanswer
 

Salut tout le monde,
 
Je dois faire une requête simple au premier abors mais qui me pose un problème au second :D (ché pas si ça se dit)
 
Pour ce faire, mettons-nous en situation ^^
 
- J'ai une table SALARIE avec tous les champs traditionnel
- J'ai une table VACUITE qui enregistre les mois pendant lesquels les salariés sont librent qui est composée de v_salarie (id du salarié) et v_mois (num du mois de l'année)
 
But du jeu, dans un formulaire php, l'utilisateur va cocher des mois et en validant le formulaire, la liste des salariés librent ces mois là doit s'afficher.
 
Voilà où j'en suis. Mon code php me génère une requête du genre :
 
SELECT s_nom, s_prenom FROM salarie, vacuite WHERE v_mois IN (4, 5, 6) AND s_id = v_salarie GROUP BY s_id ORDER BY s_nom;
 
A priori pour moi ça veut dire, récupère-moi les noms, prénoms des salariés dont les mois de vacuité se trouvent dans 4, 5, 6.
 
Bon ça marche mais y'a un problème, il me sort aussi les salariés librent avec chacune des combinaisons des 3 mois. Ce que je voudrai, c'est qu'il me sort que les salariés qui sont librent ces trois mois et pas uniquement l'un des trois ni deux des trois. Vous voyez de quoi je parle ?
 
Mon objectif à terme, est de monter une sorte de moteur de recherche qui peut porter sur d'autres critères qui ont la même architecture. A savoir par exemple pour des critères concernant les diplômes des salariés, j'ai une table avoir_diplome avec 2 champs ad_salarie et ad_diplome qui sont à chaque fois des identifiants.
 
Aidez-moi siouplé je sais pas dans quel sens prendre ça :(

mood
Publicité
Posté le 19-08-2005 à 03:00:54  profilanswer
 

n°1179467
Beegee
Posté le 19-08-2005 à 11:41:19  profilanswer
 

mySql ? Possibilité de faire des sous-requêtes ?
 
Si ce n'est pas possible, il faudra récupérer la liste des id des personnes libres tous ces mois, puis récupérer les noms.
 

Code :
  1. SELECT s_id
  2. FROM vacuite
  3. WHERE v_mois IN (4, 5, 6)
  4. GROUP BY s_id
  5. HAVING COUNT(*) = 3;


 
Puis :
 

Code :
  1. SELECT s_nom, s_prenom
  2. FROM salarie
  3. WHERE s_id IN (<liste des s_id de la première requête> )
  4. ORDER BY s_nom, s_prenom;


 
Sinon, tu peux utiliser une table temporaire pour le résultat de la première requête.
 
Si tu peux utiliser des sous-requêtes, je te laisse combiner les 2 ...

n°1179492
mrbebert
Posté le 19-08-2005 à 12:21:42  profilanswer
 

Je pense qu'on peut tout faire d'un coup [:figti]  
 
SELECT s_nom, s_prenom, COUNT(*) AS c
FROM salarie, vacuite  
WHERE v_mois IN (4, 5, 6) AND s_id = v_salarie GROUP BY s_id  
ORDER BY s_nom
HAVING c=3

n°1179550
Beegee
Posté le 19-08-2005 à 13:26:20  profilanswer
 

Ca dépend des SGBD, il me semble que ça marche pas sous Oracle par exemple, car il faudrait sélectionner les champs sur lesquels on groupe (et le COUNT(*) si on veut).

n°1179587
Inekman
Posté le 19-08-2005 à 13:58:26  profilanswer
 

Merci pour vos réponses. J'utilise MySQL en effet. Vos propositions semblent répondre au problème. En supposant que cela fonctionne, comment dois-je modifier cette requête pour étendre la restriction à d'autres critères, par exemple les diplômes.
 
SELECT s_nom, s_prenom, COUNT(*) AS c
FROM salarie, vacuite, avoir_diplome
WHERE v_mois IN (4, 5, 6) AND s_id = v_salarie AND ad_diplome IN (2, 10, 11) AND s_id = ad_salarie GROUP BY s_id  
ORDER BY s_nom
HAVING c=3  
 
Vous pensez que ça va prendre en compte les salariés qui possèdent les diplômes 2, 10 et 11 ?


Message édité par Inekman le 19-08-2005 à 13:58:57
n°1179592
Beegee
Posté le 19-08-2005 à 14:04:07  profilanswer
 

Ca marchera pas, tu comptes le nombre total de lignes renvoyées par les jointures ... En réalité, il faudrait que le COUNT(*) soit égal à (nombre de mois) * (nombre de diplômes), soit 9 dans ce cas précis ...
 
Sinon tu peux casser en plusieurs requêtes, une pour récupérer les ids de ceux qui sont libres sur les mois choisis, puis une autre pour récupérer les ids de ceux qui ont les diplômes choisis, tu fais l'intersection dans le code PHP, et enfin tu récupères les infos (noms / prénoms) des personnes qui correspondent.

n°1179599
Inekman
Posté le 19-08-2005 à 14:08:36  profilanswer
 

Donc je fais à chaque fois une requête pour chaque critères que je souhaite prendre en compte et à la fin, je prend juste les salariés qui se trouvent dans chacun des résultats retournés, c'est à dire ceux qui ont répondu à tous les critères.
 
Je vais voir ça, merci beaucoup pour votre aide les gars ;-)

n°1179601
Beegee
Posté le 19-08-2005 à 14:10:37  profilanswer
 

C'est en effet un moyen simple de le faire.
Si tu as une version de mySql récente, qui permet les sous-requêtes, tu peux faire bien mieux (tout en une seule requête).

n°1179655
Inekman
Posté le 19-08-2005 à 15:09:54  profilanswer
 

Voilà ma version de Mysql : 4.1.10a-nt - extension : mysqli
 
Tu peux m'en dire plus sur la technique all-in-one ? :)

n°1179681
Beegee
Posté le 19-08-2005 à 15:37:08  profilanswer
 

Apparemment les sous-requêtes devraient marcher, donc essaye quelque chose comme :
 

Code :
  1. SELECT s.s_nom, s.s_prenom
  2. FROM salarie s,
  3.      (SELECT   v_salarie
  4.       FROM     vacuite
  5.       WHERE    v_mois IN (4, 5, 6)
  6.       GROUP BY v_salarie
  7.       HAVING   COUNT(*) = 3) sub1,
  8.      (SELECT   ad_salarie
  9.       FROM     avoir_diplome
  10.       WHERE    ad_diplome IN (2, 10, 11)
  11.       GROUP BY ad_salarie
  12.       HAVING   COUNT(*) = 3) sub2
  13. WHERE    s.s_id = sub1.v_salarie
  14. AND      s.s_id = sub2.ad_salarie
  15. ORDER BY s.s_nom, s.s_prenom;


Message édité par Beegee le 19-08-2005 à 15:37:38
mood
Publicité
Posté le 19-08-2005 à 15:37:08  profilanswer
 

n°1180949
Inekman
Posté le 21-08-2005 à 23:11:00  profilanswer
 

Bonsoir Beegee, je passe pour voir remercier ENORMEMENT car non seulement cela fonctionne PARFAITEMENT mais en plus, j'ai réussi à l'étendre comme un grand à d'autres critères qui se trouvent dans ma base de données.
 
Donc je tenais à vous remercier d'avoir pris ces quelques minutes à m'aider ;)
 
Voilà, encore merci.

n°1180978
Beegee
Posté le 22-08-2005 à 00:40:47  profilanswer
 

De rien, bonne nuit ;)


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  SQL/NoSQL

  Requête qui cherche plusieurs valeurs simultanément

 

Sujets relatifs
MSchart avec plusieurs courbesRequête ajout de champ entre champs existants
[MySQL & PHP] Obtenir les valeurs que peut prendre un champs SETRequete sql appelant deux serveurs differents??
Activer plusieurs onglets dans une macrorequete SQL ACCESS
problème de requête[MySQL] Requête sur 2 tables un peu tordue
[perl] récupéré le code source de plusieurs pages 
Plus de sujets relatifs à : Requête qui cherche plusieurs valeurs simultanément


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