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 :

Requete sur une même table


Sujet :

Requêtes MySQL

  1. #1
    Candidat au Club
    Inscrit en
    Septembre 2011
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Septembre 2011
    Messages : 4
    Points : 3
    Points
    3
    Par défaut Requete sur une même table
    Bonsoir à tous,

    je me tourne vers vous pour une requête, qui me fait m'arracher les cheveux.

    Je souhaiterai parcourir une seule table, afin de trouver les articles qui ont exactement les mêmes caractéristiques qu'un article donné.
    Dans mon exemple suivant, je prends article 1, il doit me donner article 3 et 8
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    ref_article | caracteristique | valeur
    ----------------
    1 | couleur | rouge
    1 | taille | XL
    2 | couleur | bleu
    3 | couleur | rouge
    3 | taille | XL
    ....
    7 | taille | XL
    8 | couleur | rouge
    8 | taille | XL


    Ma requete (enfin la dernière) a pour le moment cette 'tête' là
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SELECT tab2.ref_article
    FROM articles_caracs tab1, articles_caracs tab2
    WHERE tab1.caracteristique = tab2.caracteristique
    AND tab1.valeur = tab2.valeur
    AND tab1.ref_article <> tab2.ref_article
    AND tab1.caracteristique = tab2.caracteristique
    AND tab1.ref_article =1
    Mais bien entendu elle me donne des résultats plus que farfelus.

    J'ai parcouru le forum et 'triturer' le tuto pour les doublons, (je m'excuse par avance si un sujet existait déjà) .
    Il s'agit d'un select de doublons type relatif à priori
    j'ai l'impression de tourner en rond (tentative de sous requete, jointure...) mais chou blanc. (et au bout d'un moment on ne voit plus rien)
    J'espères que certains d'entre vous pourront m'orienter.

    Merci par avance de votre aide.

  2. #2
    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,
    Essayons donc cela
    Code mysql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SELECT DISTINCT tab2.ref_article
    FROM articles_caracs tab1
    INNER JOIN articles_caracs tab2
    ON tab1.caracteristique = tab2.caracteristique
    AND tab1.valeur = tab2.valeur
    AND tab1.ref_article <> tab2.ref_article
    WHERE tab1.ref_article =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)

  3. #3
    Candidat au Club
    Inscrit en
    Septembre 2011
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Septembre 2011
    Messages : 4
    Points : 3
    Points
    3
    Par défaut
    Hello,

    Merci pour ta réponse.

    J'ai testé ta requete.

    Elle me sélectionne tous les articles qui ont une caractéristique commune et non pas exactement les même.

    Résultat obtenu avec ta requete et en suivant mon exemple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    ref_article | caracteristique | valeur
    ----------------
    3 | couleur | rouge
    3 | taille | XL
    7 | taille | XL
    8 | couleur | rouge
    8 | taille | XL
    Donc le 7 ne devrait pas être là

  4. #4
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    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 799
    Points : 34 031
    Points
    34 031
    Billets dans le blog
    14
    Par défaut
    Essaie cette requête :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    SELECT a.ref_article
    FROM articles_caracs a
    INNER JOIN
    (
        SELECT caracteristique, valeur
        FROM articles_caracs
        WHERE ref_article = 1
    ) tmp 
        ON tmp.caracteristique = a.caracteristique
        AND valeur = valeur
        AND ref_article <> 1
    GROUP BY a.ref_article
    HAVING COUNT(DISTINCT a.caracteristique) = COUNT(DISTINCT tmp.caracteristique)
    La sous-requête extrait les caractéristiques de l'article 1 et on fait une jointure de la table avec cette sous-requête pour trouver les autres articles ayant les mêmes caractéristiques puis on compare le nombre de caractéristiques de l'article 1 et des autres articles en ne conservant que les articles ayant le même nombre de caractéristiques.
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    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
    Candidat au Club
    Inscrit en
    Septembre 2011
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Septembre 2011
    Messages : 4
    Points : 3
    Points
    3
    Par défaut
    Avec une petite correction de ta requete:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    SELECT DISTINCT a.ref_article
    FROM articles_caracs a
    INNER JOIN
    (
        SELECT caracteristique, valeur
        FROM articles_caracs
        WHERE ref_article = 1
    ) tmp 
        ON tmp.caracteristique = a.caracteristique
        AND tmp.valeur = a.valeur
        AND a.ref_article <> 1
    GROUP BY a.ref_article
    HAVING COUNT(DISTINCT a.caracteristique) = COUNT(DISTINCT tmp.caracteristique)
    Mon article 7 pointe toujours le bout de son nez

    PS: merci pour l'explication de ta requete

  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
    Citation Envoyé par Gemma Voir le message
    Donc le 7 ne devrait pas être là
    Pourquoi ?
    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
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    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 799
    Points : 34 031
    Points
    34 031
    Billets dans le blog
    14
    Par défaut
    Parce qu'il n'a qu'une seule caractéristique en commun avec l'article 1.

    Voici une bonne requête, je ne sais pas s'il y a plus simple :
    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
    SELECT a.ref_article
    FROM 
    (
        SELECT caracteristique, valeur
        FROM articles_caracs
        WHERE ref_article = 1
    ) tmp
    INNER JOIN articles_caracs a 
        ON tmp.caracteristique = a.caracteristique
        AND tmp.valeur = a.valeur
        AND ref_article <> 1
    GROUP BY a.ref_article
    HAVING COUNT(DISTINCT a.caracteristique) = 
        (
            SELECT COUNT(DISTINCT caracteristique)
            FROM articles_caracs
            WHERE ref_article = 1
        )
    EDIT :
    Apparemment, on peut même enlever les DISTINCT.
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    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 !

  8. #8
    Candidat au Club
    Inscrit en
    Septembre 2011
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Septembre 2011
    Messages : 4
    Points : 3
    Points
    3
    Par défaut
    Ça marche !!!!

    [ON]Danse du poulet dans le bureau[/ON]

    Je me prosterne...
    Pour le plus simple : traitement: 0.0033 sec sur une table de + de 5000 enregistrements...je garde

    J'avoue que cette requête a largement dépasser mes faibles compétences

    Merci à vous 2

  9. #9
    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
    Citation Envoyé par CinePhil Voir le message
    Parce qu'il n'a qu'une seule caractéristique en commun avec l'article 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)

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

Discussions similaires

  1. requete sur une même table
    Par fakie dans le forum Requêtes
    Réponses: 2
    Dernier message: 23/02/2010, 11h40
  2. Requete sur une même table
    Par laipreu dans le forum Requêtes
    Réponses: 1
    Dernier message: 31/05/2008, 21h42
  3. [SQL] Probleme de requete sur une même table
    Par LP-mpascolo dans le forum Langage SQL
    Réponses: 3
    Dernier message: 30/01/2008, 14h02
  4. Fusion de deux requetes sur une même table
    Par jojosbiz dans le forum Langage SQL
    Réponses: 6
    Dernier message: 25/06/2007, 09h18
  5. [MySQL] Plusieurs même requetes sur une même table
    Par bibom dans le forum PHP & Base de données
    Réponses: 14
    Dernier message: 27/07/2006, 12h54

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