Précédent   Forum des professionnels en informatique > Bases de données > MySQL > Requêtes
Requêtes Forum d'entraide sur les requêtes MySQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 21/09/2011, 20h35   #1
Invité de passage
 
Inscription : septembre 2011
Messages : 4
Détails du profil
Informations forums :
Inscription : septembre 2011
Messages : 4
Points : 1
Points : 1
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 :
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 :
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.
Gemma est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/09/2011, 22h49   #2
Expert Confirmé
 
Avatar de Maljuna Kris
 
Homme Avcxjo MoKo
Retraité
Inscription : novembre 2005
Messages : 2 530
Détails du profil
Informations personnelles :
Nom : Homme Avcxjo MoKo
Âge : 60

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

Informations forums :
Inscription : novembre 2005
Messages : 2 530
Points : 3 523
Points : 3 523
Saluton,
Essayons donc cela
Code mysql :
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)
Maljuna Kris est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/09/2011, 10h19   #3
Invité de passage
 
Inscription : septembre 2011
Messages : 4
Détails du profil
Informations forums :
Inscription : septembre 2011
Messages : 4
Points : 1
Points : 1
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 :
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à
Gemma est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/09/2011, 10h33   #4
Modérateur
 
Avatar de CinePhil
 
Homme Philippe Leménager
Ingénieur d'études en informatique
Inscription : août 2006
Messages : 11 028
Détails du profil
Informations personnelles :
Nom : Homme Philippe Leménager
Âge : 48
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 : 11 028
Points : 18 321
Points : 18 321
Envoyer un message via MSN à CinePhil
Essaie cette requête :
Code :
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 de Formation Agronomique.
Mon blog sur la conception des BDD, le langage SQL, le PHP avec Zend Framework...
« 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 Mandriva Linux ou Mageïa ! Soutenons l'industrie logicielle française !
Linuxiens, comptez-vous !
CinePhil est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/09/2011, 10h53   #5
Invité de passage
 
Inscription : septembre 2011
Messages : 4
Détails du profil
Informations forums :
Inscription : septembre 2011
Messages : 4
Points : 1
Points : 1
Avec une petite correction de ta requete:

Code :
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
Gemma est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/09/2011, 11h09   #6
Expert Confirmé
 
Avatar de Maljuna Kris
 
Homme Avcxjo MoKo
Retraité
Inscription : novembre 2005
Messages : 2 530
Détails du profil
Informations personnelles :
Nom : Homme Avcxjo MoKo
Âge : 60

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

Informations forums :
Inscription : novembre 2005
Messages : 2 530
Points : 3 523
Points : 3 523
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)
Maljuna Kris est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/09/2011, 11h13   #7
Modérateur
 
Avatar de CinePhil
 
Homme Philippe Leménager
Ingénieur d'études en informatique
Inscription : août 2006
Messages : 11 028
Détails du profil
Informations personnelles :
Nom : Homme Philippe Leménager
Âge : 48
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 : 11 028
Points : 18 321
Points : 18 321
Envoyer un message via MSN à CinePhil
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 :
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 de Formation Agronomique.
Mon blog sur la conception des BDD, le langage SQL, le PHP avec Zend Framework...
« 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 Mandriva Linux ou Mageïa ! Soutenons l'industrie logicielle française !
Linuxiens, comptez-vous !
CinePhil est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 22/09/2011, 11h22   #8
Invité de passage
 
Inscription : septembre 2011
Messages : 4
Détails du profil
Informations forums :
Inscription : septembre 2011
Messages : 4
Points : 1
Points : 1
Ç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
Gemma est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/09/2011, 11h24   #9
Expert Confirmé
 
Avatar de Maljuna Kris
 
Homme Avcxjo MoKo
Retraité
Inscription : novembre 2005
Messages : 2 530
Détails du profil
Informations personnelles :
Nom : Homme Avcxjo MoKo
Âge : 60

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

Informations forums :
Inscription : novembre 2005
Messages : 2 530
Points : 3 523
Points : 3 523
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)
Maljuna Kris est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 17h30.


 
 
 
 
Partenaires

Hébergement Web