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 :

Sélectionner les parents qui n'ont pas d'enfants roux


Sujet :

Requêtes MySQL

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 3
    Points : 2
    Points
    2
    Par défaut Sélectionner les parents qui n'ont pas d'enfants roux
    Bonjour tout le monde,
    J'aimerais faire un truc en sql qui n'est a priori pas possible, mais en même temps, vu que je découvre tous les jours de nouvelles possibilités, je me dis, pourquoi pas ça ?
    Je prends l'exemple des parents/enfants parce que c'est plus clair, mais dans mon cas, en fait, il s'agit de bacs plastiques.
    Donc j'ai une table Parent avec un champ parent_id et 3 enregistrements 1, 2, et 3.
    Et une table enfants avec 4 enregistrements :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    +----+------------+---------+
    | id | parent_id  | couleur |
    +----+------------+---------+
    | 1  |     1      | blond   |
    +----+------------+---------+
    | 2  |     1      | roux    |
    +----+------------+---------+
    | 3  |     2      | blond   |
    +----+------------+---------+
    | 4  |     3      | brun    |
    +----+------------+---------+
    je veux sélectionner les parents 2 et 3, sur le critère qu'aucun de leurs enfants n'est roux.

    Le problème est que pour préciser la couleur d'exclusion, je suis obligé de mettre un WHERE couleur="roux" , et que du coup, il ne me sélectionne pas les parents sans enfants roux, justement.

    Bon, alors, je pourrais peut-être faire ça avec les ensembles, vu que je suis en 5.0.21 ? Mais je ne me suis jamais servi des ensembles. Si vous me dites que c'est possible, je me penche dessus.

    Merci !

  2. #2
    Expert confirmé

    Homme Profil pro
    SDE
    Inscrit en
    Août 2007
    Messages
    2 013
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : SDE

    Informations forums :
    Inscription : Août 2007
    Messages : 2 013
    Points : 4 324
    Points
    4 324
    Par défaut
    Bonjour,

    Je propose quelque chose comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SELECT PARENT.id
    FROM PARENT
    WHERE PARENT.id NOT IN (
         SELECT PARENT.id
              INNER JOIN ENFANT ON PARENT.id = ENFANT.parent_id
         WHERE ENFANT.couleur = 'roux'
    )
    Attention on a pour convention de ne jamais nommer de table au pluriel.
    La raison en est qu'une table correspond a une entité, et qu'une entité représente un tuple et non un ensemble.
    http://alaindefrance.wordpress.com
    Certifications : SCJP6 - SCWCD5 - SCBCD5 - SCMAD1
    SDE at BitTitan

  3. #3
    Candidat au Club
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 3
    Points : 2
    Points
    2
    Par défaut
    Yes !! c'est exactement ça !! Merci beaucoup !

  4. #4
    Expert confirmé

    Homme Profil pro
    SDE
    Inscrit en
    Août 2007
    Messages
    2 013
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : SDE

    Informations forums :
    Inscription : Août 2007
    Messages : 2 013
    Points : 4 324
    Points
    4 324
    Par défaut
    En revanche pour ce type de données père/fils on adopte souvent une association d'arité 1.
    Sur ton modèle tu ne peut pas gérer les fils de tes fils par exemple.
    La solution consiste a tout stocker dans la même table, et de fait une jointure vers elle même.
    Tu a une clé étrangère contenant un identifiant de la même table.
    Tu peut aussi gérer ce type de données avec une représentation intervallaire.
    http://alaindefrance.wordpress.com
    Certifications : SCJP6 - SCWCD5 - SCBCD5 - SCMAD1
    SDE at BitTitan

  5. #5
    Candidat au Club
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 3
    Points : 2
    Points
    2
    Par défaut
    Oui, c'est clair. Je parlais de père-fils pour simplifier ma démonstration, mais en fait, dans mon cas, c'était un truc assez spécifique, avec une table "table", et une table "champ", et je cherchai à trouver les enregistrements de table qui n'avait pas un certain type de champ créé. Donc ça ne nécessitait pas d'aller plus loin dans l'arborescence.

    Je connaissais déjà la méthode intervallaire, mais je ne l'ai pas encore utilisée. Je vais garder cette page sous le coude, elle me sera bien utile le moment venu.

    Merci !

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 12/06/2008, 11h53
  2. Réponses: 3
    Dernier message: 06/02/2008, 17h23
  3. sauvgarder les objets qui n'ont pas été sauvgarder
    Par ferrero dans le forum Hibernate
    Réponses: 5
    Dernier message: 23/05/2007, 16h22
  4. Réponses: 6
    Dernier message: 11/07/2006, 10h04
  5. [XSL] Sélectionner les éléments qui n'ont pas un certain fils
    Par lebechen dans le forum XSL/XSLT/XPATH
    Réponses: 3
    Dernier message: 05/07/2006, 17h54

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