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

Requêtes MySQL Discussion :

Requête sql complexe


Sujet :

Requêtes MySQL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Novembre 2010
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2010
    Messages : 4
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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

  2. #2
    Expert éminent
    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 818
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    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 : 16 818
    Billets dans le blog
    14
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 Supérieure de Formation de l'Enseignement Agricole, en retraite... mais toujours Autoentrepreneur à l'occasion.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « 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 la suite Linux Mageïa !

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Novembre 2010
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2010
    Messages : 4
    Par défaut
    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 ?

  4. #4
    Expert éminent
    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 818
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    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 : 16 818
    Billets dans le blog
    14
    Par défaut
    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 :
    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 Supérieure de Formation de l'Enseignement Agricole, en retraite... mais toujours Autoentrepreneur à l'occasion.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « 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 la suite Linux Mageïa !

  5. #5
    Futur Membre du Club
    Profil pro
    Inscrit en
    Novembre 2010
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2010
    Messages : 4
    Par défaut
    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)....

  6. #6
    Expert éminent
    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 818
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    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 : 16 818
    Billets dans le blog
    14
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 Supérieure de Formation de l'Enseignement Agricole, en retraite... mais toujours Autoentrepreneur à l'occasion.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « 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 la suite Linux Mageïa !

  7. #7
    Membre Expert Avatar de Madfrix
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    2 326
    Détails du profil
    Informations personnelles :
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Juin 2007
    Messages : 2 326
    Par défaut
    Par quel langage attaque tu ta bdd ? Php ?

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

Discussions similaires

  1. requête sql complexe
    Par julien_d dans le forum SQL
    Réponses: 7
    Dernier message: 01/05/2007, 17h03
  2. Requète SQL complexe
    Par NicoNGRI dans le forum MS SQL Server
    Réponses: 7
    Dernier message: 01/08/2006, 10h10
  3. Requête sql complexe
    Par new_wave dans le forum Langage SQL
    Réponses: 1
    Dernier message: 03/01/2006, 11h55
  4. Requête SQL Complexe
    Par zut94 dans le forum MS SQL Server
    Réponses: 1
    Dernier message: 25/11/2005, 20h53
  5. Requête SQL complexe. Comment faire ....
    Par BilTCD dans le forum Langage SQL
    Réponses: 4
    Dernier message: 05/11/2004, 16h18

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