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 :

Comment récupérer une valeur avec deux conditions dans une colonne (sur deux enregistrements différents) [MySQL-5.6]


Sujet :

Requêtes MySQL

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2011
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2011
    Messages : 6
    Points : 8
    Points
    8
    Par défaut Comment récupérer une valeur avec deux conditions dans une colonne (sur deux enregistrements différents)
    Bonjour à tous,

    La base de données est constituée de:
    - une table "details" :: champs "id", "ref_mots" et "ref_definitions"
    - une table "mots" :: champs "id", "mot"
    - une table "definitions" :: champs "id", "definition"

    Un mot peut contenir une ou plusieurs définitions
    Une définition est la propriété d'un à plusieurs mots

    Dans une liste de mot, un mot est sélectionné.
    La requête pour en afficher ses définitions est :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT definitions.id, definitions.definition
    FROM details LEFT JOIN definitions ON definitions.id=details.ref_definitions
    WHERE (((details.ref_mots)=[Identifiant du mot ?]));
    J'aurais aimé afficher tous les mots du dictionnaire dont les définitions sont les mêmes que, par exemple, l'identifiant du mot "1".

    J'ai essayer avec des requêtes imbriquées (sous-requêtes), des requêtes avec CASE, IF, EXIST mais sans succès.

    J'ai du mal à comprendre les sous-requêtes. Ce n'est pas faute d'avoir cherché et fait des test, mais je n'arrive pas à savoir comment je peux faire une requête qui répondent à deux conditions différentes (sur deux enregistrements différent) dans un seul champs ("details.ref_definitions").

    Un des test :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT details.ref_mots
    FROM details
    WHERE  details.ref_definitions IN 
    (SELECT details.ref_definitions = 1 FROM details)
    AND
    (SELECT details.ref_definitions = 2 FROM details)
    me retourne une errreur"1242" - Subquery returns more than 1 row

    Ce serait sympa de m'expliquer comment je peux construire ma requête.

    D'avance je remercie ce forum d'exister ainsi que les personnes donnant un coup de pouce aux désœuvrés comme moi.

    Eric

  2. #2
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Points : 13 092
    Points
    13 092
    Par défaut
    Bonjour

    Citation Envoyé par Vivaldi1er Voir le message
    J'aurais aimé afficher tous les mots du dictionnaire dont les définitions sont les mêmes que, par exemple, l'identifiant du mot "1".
    Vous voulez tous les mots ayant les mêmes définitions au moins (ils peuvent en avoir plus) ou ayant exactement la même liste de définitions que le mot 1 ?

    Vous êtes dans un cas de division relationnelle, donc ceci devrait vous aider

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2011
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2011
    Messages : 6
    Points : 8
    Points
    8
    Par défaut
    Merci aieeeuuuuu de prendre mon problème.

    Je ne veux que les mots qui partagent les mêmes définitions.

    Admettons le mot "requérir".
    Il contient deux définitions. les 'id' de ces définitions sont, par exemple, l'id 8 et l'id 9.
    Je voudrais obtenir la liste des mots qui ne contiennent que les définitions dont l'id est 8 ET l'id est 9.
    Un mot contenant une ou trois définitions ne rentre pas dans le cas de figure souhaité.

    Mais comment y arriver !!

  4. #4
    bm
    bm est déconnecté
    Membre confirmé

    Homme Profil pro
    Freelance
    Inscrit en
    Octobre 2002
    Messages
    874
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Drôme (Rhône Alpes)

    Informations professionnelles :
    Activité : Freelance
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Octobre 2002
    Messages : 874
    Points : 556
    Points
    556
    Billets dans le blog
    6

  5. #5
    Membre averti
    Profil pro
    Administrateur
    Inscrit en
    Mai 2008
    Messages
    237
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations professionnelles :
    Activité : Administrateur
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2008
    Messages : 237
    Points : 433
    Points
    433
    Par défaut Mot ayant la même définition que le mot X
    Citation Envoyé par Vivaldi1er Voir le message
    J'aurais aimé afficher tous les mots du dictionnaire dont les définitions sont les mêmes que, par exemple, l'identifiant du mot "1".
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT p.mot
    FROM mots p
    INNER JOIN details r 
    ON r.ref_mots = p.id 
    AND r.ref_definitions IN (SELECT ref_definitions FROM details WHERE ref_mots = 1)

  6. #6
    Membre expert
    Avatar de Maljuna Kris
    Homme Profil pro
    Retraité
    Inscrit en
    Novembre 2005
    Messages
    2 613
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 72
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2005
    Messages : 2 613
    Points : 3 950
    Points
    3 950
    Par défaut
    Saluton,

    La solution que propose manzeki correspond à la citation qui la précède mais pas à la précision apportée par Vivaldi1er : à savoir qu'il cherche les mots possédant toutes les définitions mais rien que les définitions du mot dont l'identifiant est 1., et non tous les mots qui ont au moins une définition commune avec le mot dont l'identifiant est 1.

    Il va falloir compter les définitions du mot dont l'identifiant est 1 et celles de chaque mot candidat c'est à dire qui est en relation avec toutes les définitions du mot dont l'identifiant est 1.

    Puisque nous sommes en MySQL j'ai pensé à ett solution qui utilise l'horrible (mais ici bien pratique) GROUP_CONCAT
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SELECT p.mot, p.id, GROUP_CONCAT(r.ref_definitions ORDER BY r.ref_definitions) as defs
    FROM mots p
    INNER JOIN details r 
    ON r.ref_mots = p.id
    WHERE p.id <> 1
    GROUP BY p.id
    HAVING defs =(SELECT GROUP_CONCAT(ref_definitions ORDER BY ref_definitions) FROM details WHERE ref_mots = 1)
    Kie lumo eksistas ankaŭ ombro troviĝas. L.L. Zamenhof
    articles : Comment émuler un tableau croisé [quasi] dynamique
    et : Une énigme mathématique résolue avec MySQL
    recommande l'utilisation de PDO (PHP5 Data Objects)

  7. #7
    Futur Membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2011
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2011
    Messages : 6
    Points : 8
    Points
    8
    Par défaut
    Bonjour à tous,
    Et surtout un très grand merci pour toutes vos réponses.

    J'ai mis du temps à répondre car je me suis emberlificoté avec la toute première réponse de "aieeeuuuuu" qui avait donné un lien.
    Vous parliez de "division relationnelle" et comme je tournait en rond, j'ai effectué d'autres recherches sur ces mots.
    C'est la première fois de ma vie que j'entendait parler de "division relationnelle".

    Ce que je ne suis pas arrivé à faire:
    - Transposer le fait que je n'ai besoin de faire une comparaison que sur les définition composant le mot "x" sur une table intermédiaire contenant des centaines de possibilités.
    Car d'après ce que j'ai compris, on faisait toujours appel à un ensemble .. donc sur toutes les lignes d'une table.

    Maljuna Kris a trouvé la solution au problème qui correspond parfaitement à mon besoin.

    Ce que je ne comprends pas dans cette requête, c'est à quoi sert :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    HAVING defs =(SELECT GROUP_CONCAT(ref_definitions ORDER BY ref_definitions) FROM details WHERE ref_mots = 1)

    On utilise souvent le mot clé "HAVING" avec les fonctions telle que SUM(), COUNT(), AVG(), MIN() ou MAX().
    Encore MILLES MERCIS À VOUS TOUS pour sacrifier de votre temps aux personnes perdues comme moi.

    p.s. Remerciements également à bm pour le lien sur la formation à SQL et que je n'avait pas encore trouvé .. cela tombe à pic .. pour d'autres requêtes.

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 06/01/2015, 15h10
  2. Réponses: 4
    Dernier message: 02/06/2007, 12h35
  3. [FLASH MX2004] Deux conditions dans une boucle
    Par pierrot10 dans le forum Flash
    Réponses: 1
    Dernier message: 06/11/2005, 16h31
  4. Récupérer les valeur d'un énuméré dans une string
    Par Oliv_75 dans le forum SL & STL
    Réponses: 5
    Dernier message: 28/09/2005, 00h55
  5. Comment récupérer la valeur d'un dbGrid dans des fenêtres MDI ?
    Par sylvie cl dans le forum Composants VCL
    Réponses: 5
    Dernier message: 19/07/2005, 13h42

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