Précédent   Forum des professionnels en informatique > Bases de données > MySQL > Requêtes
Requêtes Forum d'entraide sur les requêtes MySQL
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 22/11/2010, 13h09   #1
Invité de passage
 
Inscription : novembre 2010
Messages : 4
Détails du profil
Informations forums :
Inscription : novembre 2010
Messages : 4
Points : 1
Points : 1
Par défaut Requête sql complexe

Bonjour,

Je souhaite faire une requête un peu compliquée. Je n'y arrive pas. Si vous pouviez m'aider...

Voici le descriptif des tables :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
 
`entite` (
  `id_entite` int(11) NOT NULL,
  `name` varchar(255) NOT NULL,
  PRIMARY KEY (`id_entite`)
)
 
`object` (
  `id_object` int(11) NOT NULL,
  `name_object` varchar(255) NOT NULL,
  PRIMARY KEY (`id_object`)
)
 
 
`dependance` (
  `id_entite` int(11) NOT NULL,
  `id_object` int(11) NOT NULL,
  PRIMARY KEY (`id_entite`,`id_object`)
)
L'idée est de donner tous les id_entite dont les objects font partie d'une liste X = {'name1', 'name2', 'nameX'}

donc par exemple si on a :
- une entite X donc le nom est "fac"
- deux objects pour cette entité : "table", "vitre".
- une liste qui comporte les éléments suivants : {"table","haricot","vitre","pomme", "poire"}

Etant donné que les deux objects de "fac" font partie de la liste, l'id_entite de "fac" sera retourné. Si un seul des deux objects fait partie de la liste, on ne retourne rien pour cette entité.

Et l'idée est de faire une requete qui rend ce type de résultat en fonction d'une liste.

si vous savez comment faire, merci à vous parce-que je galère un peu la...

Merci
isamug est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/11/2010, 14h05   #2
Modérateur
 
Avatar de CinePhil
 
Homme Philippe Leménager
Ingénieur d'études en informatique
Inscription : août 2006
Messages : 10 944
Détails du profil
Informations personnelles :
Nom : Homme Philippe Leménager
Âge : 48
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations professionnelles :
Activité : Ingénieur d'études en informatique
Secteur : Enseignement

Informations forums :
Inscription : août 2006
Messages : 10 944
Points : 18 137
Points : 18 137
Envoyer un message via MSN à CinePhil
Tu cherches donc toutes les entités associées à tous les éléments d'une liste dans la table dependance.

Commence par faire une requête qui va sélectionner toutes les lignes de dependance avec l'entité et un objet appartenant à la liste :
Code :
1
2
3
4
5
SELECT e.name AS entite
FROM entite AS e
INNER JOIN dependance AS d ON d.id_entite = e.id_entite
    INNER JOIN object AS o ON o.id_object = d.id_object
WHERE o.name_object IN ('table', 'vitre')
Avec cette requête, tu auras aussi les entités qui seront associées à 'table' et 'poire' ou à 'vitre' et 'haricot' ou seulement à 'table' ou seulement à 'vitre'...

Comme tu ne veux que les entités qui ne sont associées qu'au nombre d'éléments de la liste, il faut faire un groupage et ne retenir ceux sont le nombre d'éléments est égal au nombre d'éléments de la liste :
Code :
1
2
3
4
5
6
7
SELECT e.name AS entite
FROM entite AS e
INNER JOIN dependance AS d ON d.id_entite = e.id_entite
    INNER JOIN object AS o ON o.id_object = d.id_object
WHERE o.name_object IN ('table', 'vitre')
GROUP BY e.name
HAVING COUNT(*) = 2
__________________
Philippe Leménager. Ingénieur d'étude à l'École Nationale de Formation Agronomique.
Mon blog sur la conception des BDD, le langage SQL, le PHP avec Zend Framework...
« Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
À la maison comme au bureau, j'utilise Mandriva Linux ou Mageïa ! Soutenons l'industrie logicielle française !
Linuxiens, comptez-vous !
CinePhil est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/11/2010, 14h41   #3
Invité de passage
 
Inscription : novembre 2010
Messages : 4
Détails du profil
Informations forums :
Inscription : novembre 2010
Messages : 4
Points : 1
Points : 1
oui !!! c'est presque ça sauf que having count(*) ne doit pas être figé. Il doit être égal au nombre d'object pour une entité donnée. Ainsi, on pourra déterminer toutes les entitées concernées.
comment on peut faire ?
isamug est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/11/2010, 14h50   #4
Modérateur
 
Avatar de CinePhil
 
Homme Philippe Leménager
Ingénieur d'études en informatique
Inscription : août 2006
Messages : 10 944
Détails du profil
Informations personnelles :
Nom : Homme Philippe Leménager
Âge : 48
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations professionnelles :
Activité : Ingénieur d'études en informatique
Secteur : Enseignement

Informations forums :
Inscription : août 2006
Messages : 10 944
Points : 18 137
Points : 18 137
Envoyer un message via MSN à CinePhil
Citation:
Envoyé par isamug Voir le message
oui !!! c'est presque ça sauf que having count(*) ne doit pas être figé. Il doit être égal au nombre d'object pour une entité donnée. Ainsi, on pourra déterminer toutes les entitées concernées.
Euh... moi pas comprendre là !

Ton besoin d'origine était celui-ci :
Citation:
Etant donné que les deux objects de "fac" font partie de la liste, l'id_entite de "fac" sera retourné. Si un seul des deux objects fait partie de la liste, on ne retourne rien pour cette entité.

Et l'idée est de faire une requete qui rend ce type de résultat en fonction d'une liste.
__________________
Philippe Leménager. Ingénieur d'étude à l'École Nationale de Formation Agronomique.
Mon blog sur la conception des BDD, le langage SQL, le PHP avec Zend Framework...
« Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
À la maison comme au bureau, j'utilise Mandriva Linux ou Mageïa ! Soutenons l'industrie logicielle française !
Linuxiens, comptez-vous !
CinePhil est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/11/2010, 14h51   #5
Membre Expert
 
Avatar de Madfrix
 
Inscription : juin 2007
Messages : 2 278
Détails du profil
Informations personnelles :
Localisation : France, Gironde (Aquitaine)

Informations forums :
Inscription : juin 2007
Messages : 2 278
Points : 2 324
Points : 2 324
Par quel langage attaque tu ta bdd ? Php ?
Madfrix est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/11/2010, 15h00   #6
Invité de passage
 
Inscription : novembre 2010
Messages : 4
Détails du profil
Informations forums :
Inscription : novembre 2010
Messages : 4
Points : 1
Points : 1
Citation:
Envoyé par CinePhil Voir le message
Euh... moi pas comprendre là !

Ton besoin d'origine était celui-ci :
ouais désolé j'explique pas bien
je recommence :

on a par exemple ca :

liste = {"pomme","poire","vitre","piston"}
entité = {"1","2","3","4"}
dependance = {"1"=>"pomme", "1"=>"poire", "2"=>"smiley", "3"=>"noix", "3" =>"smiley", "3"=>"vert","4" => "piston"}
object = {"pomme","poire","vitre","noix","smiley"}

on doit avoir comme resultats :

1 => s'affiche (car pomme et poire font partie de la liste et ces deux objects sont les seules dépendances de 1 ;

2 => n'apparaitra pas car "smiley" n'est pas dans la liste ;

3 =>n'apparaitra pas car "noix" est présent mais ni "smiley", ni "vert" ne le sont.

4 => s'affiche car "piston" est dans la liste et c'est l'unique dépendance de "4"

la requête que tu m'as donnée fonctionne car elle permet de retourner les entités dont le nombre d'objects qui en dépendent vaut 2. mais je souhaite connaitre toutes les entitées dont les objects sont dans la liste.

Je ne sais pas si c'est plus clair ?

en fait à la fin il faudrait terminer la requête par qqch comme :
HAVING COUNT(*) = (SELECT count(*) FROM dependance WHERE dependance.id_entite = entite.id_entite)....
isamug est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/11/2010, 15h13   #7
Modérateur
 
Avatar de CinePhil
 
Homme Philippe Leménager
Ingénieur d'études en informatique
Inscription : août 2006
Messages : 10 944
Détails du profil
Informations personnelles :
Nom : Homme Philippe Leménager
Âge : 48
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations professionnelles :
Activité : Ingénieur d'études en informatique
Secteur : Enseignement

Informations forums :
Inscription : août 2006
Messages : 10 944
Points : 18 137
Points : 18 137
Envoyer un message via MSN à CinePhil
Donc en fait tu veux les entités qui sont en dépendance avec des objects de la liste et qui n'aient pas d'autre dépendance que les object de la liste ?

Code :
1
2
3
4
5
6
7
8
9
10
11
SELECT e.name AS entite
FROM entite AS e
INNER JOIN dependance AS d ON d.id_entite = e.id_entite
    INNER JOIN object AS o ON o.id_object = d.id_object
WHERE o.name_object IN ('table', 'vitre')
    AND NOT EXISTS (
        SELECT *
        FROM dependance AS d1
        INNER JOIN object AS o1 ON o1.id_object = d1.od_object
        WHERE d1.id_entite = d.id_entite
            AND o1.name_object NOT IN ('table', 'vitre')
Ce qui se lit :
Sélectionner les entités qui ont une dépendance avec les objets 'table' ou 'vitre' et pour lesquelles il n'existe pas de dépendance avec des objets autres que 'table' ou 'vitre'.

Ça répond à ton besoin ?

Peut-être même que ma requête précédente, légèrement modifiée fonctionne aussi :
Code :
1
2
3
4
5
6
7
SELECT e.name AS entite
FROM entite AS e
INNER JOIN dependance AS d ON d.id_entite = e.id_entite
    INNER JOIN object AS o ON o.id_object = d.id_object
WHERE o.name_object IN ('table', 'vitre')
GROUP BY e.name
HAVING COUNT(*) <= 2
Avec la jointure interne, je n'aurai que les dépendances avec au moins un des éléments de la liste et je limite le maxi à 2, c'est à dire seulement à la liste.
__________________
Philippe Leménager. Ingénieur d'étude à l'École Nationale de Formation Agronomique.
Mon blog sur la conception des BDD, le langage SQL, le PHP avec Zend Framework...
« Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
À la maison comme au bureau, j'utilise Mandriva Linux ou Mageïa ! Soutenons l'industrie logicielle française !
Linuxiens, comptez-vous !
CinePhil est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/11/2010, 15h37   #8
Invité de passage
 
Inscription : novembre 2010
Messages : 4
Détails du profil
Informations forums :
Inscription : novembre 2010
Messages : 4
Points : 1
Points : 1
Je n'avais pas vu ça comme ça mais oui voilà !!!

Merci beaucoup
isamug 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 04h06.


 
 
 
 
Partenaires

Hébergement Web