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 :

Simuler INTERSECT sur la même table pour n valeurs [MySQL-5.5]


Sujet :

Requêtes MySQL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Décembre 2012
    Messages
    129
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations forums :
    Inscription : Décembre 2012
    Messages : 129
    Par défaut Simuler INTERSECT sur la même table pour n valeurs
    Bonjour à tous,

    Après quelques recherches sur google je pensais avoir réussi à simuler INTERSECT mais il s'avère que je me suis un peu avancé...

    Voici le scénario testé.
    J'ai deux tables liées par la clef étrangère b_fk_a

    TableA
    a_id
    1
    2
    3

    TableB
    b_id - b_fk_a - b_val
    1 - 1 - rouge
    2 - 1 - bleu
    3 - 2 - rouge
    4 - 3 - bleu

    Je fais cette requête pour récupérer les a_id qui possède à la fois la valeur rouge et la valeur bleu :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    SELECT DISTINCT a_id FROM tableB AS b0 CROSS JOIN tableB AS b1 INNER JOIN tableA ON a_id = b1.b_fk_a WHERE (b0.b_val = 'rouge' AND b1.b_val = 'bleu')
    Ca fonctionne, j'obtiens bien un seul a_id = 1

    Le problème c'est que ça ne fonctionne plus 'avec de plus grandes tables et un filtre sur plus de deux valeurs.
    Exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    SELECT DISTINCT a_id FROM tableB AS b0 CROSS JOIN tableB AS b1 CROSS JOIN tableB AS b2 INNER JOIN tableA ON a_id = b2.b_fk_a WHERE (b0.b_val = 'rouge' AND b1.b_val = 'bleu' AND b2.b_val = 'vert')
    Je me retrouve avec beaucoup plus de valeurs que ce que je devrais...

    Je pense que je m'y prends mal et que la requête sur 2 valeurs marchent par chance. Mais je ne vois pas d'où ça vient.

    Merci d'avance à ceux qui prendront le temps de me lire.

  2. #2
    Expert confirmé
    Avatar de StringBuilder
    Homme Profil pro
    Chef de projets
    Inscrit en
    Février 2010
    Messages
    4 197
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projets
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2010
    Messages : 4 197
    Billets dans le blog
    1
    Par défaut
    Si les b_val sont uniques pour un même b_fk_a, alors cette solution fonctionne parfaitement :
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    select a_id
    from TableA
    inner join TableB on TableB.b_fk_a = TableA.id
    where TableB.b_val in ('rouge', 'vert', 'bleu')
    group by a_id
    having count(TableB.b_val) = 3;

    Où 3 est le nombre d'éléments dans la clause IN.

    Si on peut avoir plusieurs même valeurs de b_val pour un même b_fk_a, alors on peut rajouter un DISTINCT dans le count.

  3. #3
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Décembre 2012
    Messages
    129
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations forums :
    Inscription : Décembre 2012
    Messages : 129
    Par défaut
    Très astucieux !

    C'est exactement ce que je cherchai. Pas besoin de distinct dans mon cas mais il est bon de le préciser !

    Merci beaucoup.

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

Discussions similaires

  1. [Toutes versions] Condition sur 2 champs d'une même table pour éviter des doublons
    Par btks59 dans le forum Modélisation
    Réponses: 6
    Dernier message: 23/05/2011, 08h48
  2. Sum différents sur sur une même table ...
    Par Saloucious dans le forum Langage SQL
    Réponses: 4
    Dernier message: 05/10/2005, 15h51
  3. UPDATE sur la même table
    Par Papino dans le forum Décisions SGBD
    Réponses: 5
    Dernier message: 02/09/2005, 10h38
  4. Réponses: 2
    Dernier message: 29/09/2004, 09h07
  5. jointure sur une même table
    Par guillaumeVb6 dans le forum Langage SQL
    Réponses: 7
    Dernier message: 06/09/2004, 15h08

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