Précédent   Forum des professionnels en informatique > Bases de données > Langage SQL
Langage SQL Forum d'entraide sur le langage SQL et sur les questions liées à la conception de schéma (DDL). Cours SQL
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 24/04/2011, 22h52   #1
Invité de passage
 
Homme Fodé Levtchenko
Elève-ingénieur
Inscription : avril 2010
Messages : 11
Détails du profil
Informations personnelles :
Nom : Homme Fodé Levtchenko

Informations professionnelles :
Activité : Elève-ingénieur

Informations forums :
Inscription : avril 2010
Messages : 11
Points : 1
Points : 1
Par défaut Requête imbriquée

Bonjour,
je suis en train de développer un formulaire(sous forme de checkbox) selon lequel un internaute peut effectuer des recherches dans ma base selon plusieurs criteres.
Il existe donc plusieurs combinaisons pour traiter ces requetes.
EX:
Choix critere 1
rouge
bleu
noir
...
Choix critere2
balle de tennis
balle ping pong
balle foot
.....

L'utilisateur peut choisir plusieurs critères de Choix 1 en les combinant aux critères de Choix 2.

J'ai donc écrit une fonction pour générer une requête en fonction des critères choisis.
Mais je rencontre des problèmes dans d'autres fonctions qui font que je peux pas tester mon script.
Je voudrais donc savoir pour etre rassuré est ce qu'une requête du genre :
T1 union T2 union T3 union T4 IN (T11 union T12 union T13);
est syntaxiquement correct.
Les Ti representent des select id from table where colonne='attribut x'

Merci d'avance pour vos réponses.
scoleproj est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/04/2011, 23h23   #2
Expert Confirmé
 
Homme
Inscription : mai 2002
Messages : 1 638
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 29
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : mai 2002
Messages : 1 638
Points : 2 630
Points : 2 630
Bonjour, non.

Peut-etre pourriez-vous présenter correctement votre besoin afin que l'on vous oriente un peu mieux ? (sgbd, table, exemple de résultat voulu, ...)
punkoff est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/04/2011, 08h11   #3
Membre Expert
 
Avatar de iberserk
 
Homme Bruno IGNACE
Architecte de base de données
Inscription : novembre 2004
Messages : 1 299
Détails du profil
Informations personnelles :
Nom : Homme Bruno IGNACE
Âge : 30
Localisation : France, Gironde (Aquitaine)

Informations professionnelles :
Activité : Architecte de base de données
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : novembre 2004
Messages : 1 299
Points : 2 282
Points : 2 282
Envoyer un message via MSN à iberserk
Citation:
T1 union T2 union T3 union T4 IN (T11 union T12 union T13);
dans l'idée oui pour la partie de gauche mais pourriez vous précisez la partie avec le 'IN' dont je n'ai pas saisi l’intérêt.

Précisez votre SGBD merci.
__________________
Prendre conscience, c'est transformer le voile qui recouvre la lumière en miroir.
iberserk est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/04/2011, 15h22   #4
Invité de passage
 
Homme Fodé Levtchenko
Elève-ingénieur
Inscription : avril 2010
Messages : 11
Détails du profil
Informations personnelles :
Nom : Homme Fodé Levtchenko

Informations professionnelles :
Activité : Elève-ingénieur

Informations forums :
Inscription : avril 2010
Messages : 11
Points : 1
Points : 1
Bonjour,
tout d'abord je vous remercie pour votre intérêt.
J'utilise postgresql comme sgbd.
J'ai une table entreprise qui contient: l'id de l'entreprise,nom,métier,ville, longitude,latitude (ces coordonnées géographique sont utilisés pour localiser apres l'entreprise sur la carte).
L'utilisateur doit pouvoir effectuer une recherche par ville et/ou par metier de l'entreprise.

Ex: je veux les coordonnées géographique des entreprises qui se trouvent dans Paris,Lille,Bordeaux dont le métier principal est : logistique,réseau,informatique.

L'idée que j'ai eu donc ,c'est de generer en premier une requete pour chaque metier coché dans le formulaire. Puis de faire l'union entre les requetes générées pour d'autres metiers.
Idem pour les villes.
Et enfin pour lier la sous-requete ville avec la requete metier, j'utilise un IN.
scoleproj est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/04/2011, 15h59   #5
Expert Confirmé
 
Homme
Inscription : mai 2002
Messages : 1 638
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 29
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : mai 2002
Messages : 1 638
Points : 2 630
Points : 2 630
donc si je comprend bien :
une entreprise va avoir autant d’occurrence dans votre table qu'elle n'a de métier et qu'elle n'a de géolocalisation différente ....?

Par exemple :
Code :
1
2
3
4
5
6
7
 
id entr, nom, metier, ville
1, ent1, informatique, lyon
1, ent1, réseau, lyon
1, ent1, informatique, paris
1, ent1, réseau, paris
1, ent1, logistique, paris
punkoff est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/04/2011, 16h35   #6
Invité de passage
 
Homme Fodé Levtchenko
Elève-ingénieur
Inscription : avril 2010
Messages : 11
Détails du profil
Informations personnelles :
Nom : Homme Fodé Levtchenko

Informations professionnelles :
Activité : Elève-ingénieur

Informations forums :
Inscription : avril 2010
Messages : 11
Points : 1
Points : 1
Oui exactement, c'est bien ca.
Il existe peut être un autre moyen...?
scoleproj est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/04/2011, 16h37   #7
Membre émérite
 
Homme Olivier Dehorter
Ingenieur de recherche - Ecologue
Inscription : juin 2003
Messages : 697
Détails du profil
Informations personnelles :
Nom : Homme Olivier Dehorter
Localisation : France

Informations professionnelles :
Activité : Ingenieur de recherche - Ecologue

Informations forums :
Inscription : juin 2003
Messages : 697
Points : 837
Points : 837
bonjour

ce serait bien d'avoir la structure de la (des) table(s). Mais j'ai l'impression qu'il n'y en a qu'une

et comme le sous-entend Punkoff, il y aurait un souci dans la modelistation de la base...

tres rapidement, il faudrait une table 'entreprise', une table 'activite', une table 'ville' et enfin une table des 'activite des entreprises'. cela permetterai de construire des requetes plus 'rigoureuses' pour un probleme, somme toute, pas si complexe
dehorter olivier est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/04/2011, 16h56   #8
Expert Confirmé
 
Homme
Inscription : mai 2002
Messages : 1 638
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 29
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : mai 2002
Messages : 1 638
Points : 2 630
Points : 2 630
je dirai comme dehorter olivier.

Vous avez un énorme problème de modélisation (edit : vu le poste que vous avez delete, c'est pas si horrible que ca.)

Et le schéma sera plus complexe que celui annoncé juste au dessus, mais c'est un bon début.


Mais quand vous allez avoir pas mal de données dans votre table vous allez vous tirer les cheveux pour faire vos requêtes.

Prenons un exemple simple, notre entreprise A a 3 antennes dans paris, une qui fait de la logistique, une autre du réseau, une autre de l'informatique et du réseau, ...

Bref si vous renoncez à changer de schéma, il faudrait poser un exemple complet, avec les données en base (fictive bien entendu) qui couvre tous les cas fonctionnels possibles + le résultat attendu.

Et là on pourrait surement trouver une solution (bancale).

Sinon une requête type qui pourrait vous aider dans votre recherche :

Code :
1
2
3
4
5
6
 
SELECT idEnt, ville, geoX, geoY
FROM ma_table
WHERE metier IN ('logistique', 'reseau', 'informatique')
GROUP BY idEnt, ville, geoX, geoY
HAVING count(DISTINCT metier) = 3;
cette requête renverra toutes les entreprise qui ont ces 3 métiers.
Après il faudra surement la recouper avec la même requête pour les villes..
Dans le genre :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
 
SELECT idEnt, ville, geoX, geoY
FROM ma_table a
INNER JOIN (SELECT idEnt 
                 FROM ma_table
                 WHERE ville IN ('paris', 'bordeau', 'lyon')
                 GROUP BY idEnt
                 HAVING count(DISTINCT ville) = 3) AS b ON a.idEnt = b.idEnt
 
WHERE metier IN ('logistique', 'reseau', 'informatique')
GROUP BY idEnt, ville, geoX, geoY
HAVING count(DISTINCT metier) = 3;
Edit : je ne suis pas sur que ça couvre tout vos cas fonctionnels, c'est une piste qu'il faut développer.
punkoff est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/04/2011, 17h20   #9
Invité de passage
 
Homme Fodé Levtchenko
Elève-ingénieur
Inscription : avril 2010
Messages : 11
Détails du profil
Informations personnelles :
Nom : Homme Fodé Levtchenko

Informations professionnelles :
Activité : Elève-ingénieur

Informations forums :
Inscription : avril 2010
Messages : 11
Points : 1
Points : 1
Hmm, ok merci pour cette mega-requete
Mais le bleme est que l'utilisateur peut cocher n-activités et n-villes, bon pour ce cas il y en a que 14 activités et 8 villes.
Est ce qu'il est possible de faire
Code :
1
2
3
4
5
6
7
8
9
10
11
12
 
SELECT idEnt, ville, geoX, geoY
FROM ma_table a
INNER JOIN (SELECT idEnt 
                 FROM ma_table
                 WHERE ville IN ('$v1'..'$v8')
                 GROUP BY idEnt
                 HAVING count(DISTINCT ville) = 3) AS b ON a.idEnt = b.idEnt
 
WHERE metier IN ('$metier1'...'$metier14')
GROUP BY idEnt, ville, geoX, geoY
HAVING count(DISTINCT metier) = 3;
Sachant que quelques variables $vi et $metier i peuvent ne pas etre renseignées.
scoleproj est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/04/2011, 17h54   #10
Membre émérite
 
Homme Olivier Dehorter
Ingenieur de recherche - Ecologue
Inscription : juin 2003
Messages : 697
Détails du profil
Informations personnelles :
Nom : Homme Olivier Dehorter
Localisation : France

Informations professionnelles :
Activité : Ingenieur de recherche - Ecologue

Informations forums :
Inscription : juin 2003
Messages : 697
Points : 837
Points : 837
joli punkoff

pour scoleproj

pour rendre cette idee plus generale (pour tenir compte du nombre variable de criteres) ce que tu ne faisait dans ta requete (j'ai un probleme dans ce type de notation ???
Citation:
'$v1'..'$v8'
) ????

Code :
1
2
3
4
5
6
7
SELECT idEnt, ville, geoX, geoY
FROM ma_table
WHERE metier IN ('logistique', 'reseau', 'informatique')
GROUP BY idEnt, ville, geoX, geoY
HAVING count(DISTINCT metier) = (SELECT count(DISTINCT metier
                                                   FROM ma_table
                                                  WHERE metier IN ('logistique', 'reseau', 'informatique'));

si des familles de criteres ne sont pas selectionnees, je ne vois pas d'autres solutions que d'ecrire une requete pour chaque cas
1 une pour ville et logistique
1 pour logistique seule
1 pour ville seule

a moins que punkoff qui a l'air bien plus balaise que moi a une idee

a+
dehorter olivier est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/04/2011, 17h55   #11
Expert Confirmé
 
Homme
Inscription : mai 2002
Messages : 1 638
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 29
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : mai 2002
Messages : 1 638
Points : 2 630
Points : 2 630
c'était un exemple mais qui ne répondra pas entièrement à votre besoin actuel.

D’ailleurs en la reprenant je vois qu'elle est fausse pour la 2eme partie, car elle pourrait sélectionner des entreprises qui n'ont pas le métier voulu dans les villes voulus ...

Ceci est dû au manque de la table d'association ville / métier / entreprise.


Sinon, pour en adapter le principe dans votre code il va falloir aussi changer la valeur du having count(distinct X) par votre nombre de critere de recherche.

edit: pour votre dernière requête ne pouvez-vous pas tout simplement compter le nombre de critere dans votre liste retourné par le serveur ?


En y repenssant il faudrai plutot voir une modélisation dans ce genre (à confirmer par quelqu'un qui à plus de bouteille que moi dans ce secteur) :

T_entreprise (id, idEntreprise (SIRET, ..), nom, siege, ....)
T_antenne (id, id_ent (FK sur R_entreprise), geoX, geoY, adresse, ...)
T_metier(id, description, code (NAF / APE), ...)
T_ville(id, nom, ...)
R_ANTENNE_METIER(id_ant (fk antenne), id_met (fk metier))
R_ANT_VILLE (id_vill (fk ville), id_ant (fk antenne))

Bon avec ca on peut quadriller précisément vos besoin je penses.

Ressortir toutes les entreprise dans une ville donnée :
Code :
1
2
3
4
5
6
 
SELECT id_ant, id_ent, c.nom AS "Nom Entreprise", a.nom AS "Nom Ville"
FROM T_VILLE a
INNER JOIN R_ANT_VILLE b ON b.id_vil = a.id
INNER JOIN T_ENTREPRISE c ON b.id_ent = c.id
WHERE a.nom IN ('paris', 'lyon', 'bordeaux')
De là on peut adapter ce que je vous ai donné plus haut afin de faire nos restriction sur la table R_ANT_METIER et on aura le résultat voulu.

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
 
SELECT id_ant
FROM T_METIER a
INNER JOIN R_ANTENNE_METIER b ON b.id_met = a.id
INNER JOIN (SELECT id_ant
                 FROM T_VILLE a
                  INNER JOIN R_ANT_VILLE b ON a.id_vil = b.id
                  WHERE a.nom IN ('paris', 'lyon', 'bordeaux')
                  GROUP BY id_ant
                  HAVING count(DISTINCT a.id) = 3) AS tmp ON tmp.id_ant = b.id_ant 
 
WHERE a.nom IN ('reseau', 'informatique', 'logistique')
GROUP BY id_ant
HAVING count(DISTINCT a.id) = 3
Vous saisissez le principe ?
punkoff est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/04/2011, 18h12   #12
Invité de passage
 
Homme Fodé Levtchenko
Elève-ingénieur
Inscription : avril 2010
Messages : 11
Détails du profil
Informations personnelles :
Nom : Homme Fodé Levtchenko

Informations professionnelles :
Activité : Elève-ingénieur

Informations forums :
Inscription : avril 2010
Messages : 11
Points : 1
Points : 1
Salut,
Desolé mais j'ai pas bien precisé le contexte, mais dans ce cas une entreprise est localisé dans 1 ville, et une entreprise n'a qu'un seul metier.
Les attributs metier et ville dans la table entreprise sont bien des clefs étrangères => pas besoin de faire des jointures entre les tables pour retrouver la ville d'une entreprise.
Donc du coup j'ai essayé avec cette requete qui m'a renvoyé le bon resultat:
Code :
SELECT geox,geoy FROM entreprise e WHERE e.metier IN ('reseau','logistique') AND e.ville IN ('paris','lyon');
Merci punkoff pour ton aide et ton intérêt
scoleproj est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 06h23.


 
 
 
 
Partenaires

Hébergement Web