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 :

Je n'arrive pas à trouver la bonne requête


Sujet :

Requêtes MySQL

  1. #1
    Membre régulier
    Inscrit en
    Février 2009
    Messages
    204
    Détails du profil
    Informations forums :
    Inscription : Février 2009
    Messages : 204
    Points : 123
    Points
    123
    Par défaut Je n'arrive pas à trouver la bonne requête
    Bonjour,

    je cherche la bonne requête mysql qui permette de trouver les noms des catégories à condition que le nombre de marques différentes dans chacune de ces catégories soit supérieur ou égal à 3 et que le nombre de produits dans chacun de ces marques soit supérieur ou égal à 2.

    D'abord je vous présente les 3 tables :

    1) La table category (catégorie) qui a 2 colonnes :
    - id_category : auto-increment
    - name : varchar

    Et voici les données :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    id_category | name
    ----------------
    1 | pull
    2 | pantalon
    3 | chaussure

    2) La table manufacturer (marque) qui a 2 colonnes :
    - id_manufacturer : auto-increment
    - name : varchar

    Et voici les données :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    id_manufacturer | name
    ------------------------------------
    1 | adidas
    2 | nike
    3 | puma
    3) et la table product (produit) qui a 4 colonnes :
    - id_product : auto-increment
    - id_category : int
    - id_manufacturer : int
    - name : varchar

    Et voici les données :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    id_product | id_category | id_manufacturer | name
    ---------------------------------------------------------
    1 | 1 | 1 | 1 | adidas pull rouge
    2 | 1 | 1 | 1 | adidas pull vert
    3 | 2 | 2 | 1 | adidas pantalon rouge
    4 | 2 | 2 | 1 | adidas pantalon vert
    5 | 2 | 2 | 2 | nike pantalon rouge
    6 | 2 | 2 | 2 | nike pantalon vert
    7 | 2 | 2 | 3 | puma pantalon rouge
    8 | 2 | 2 | 3 | puma pantalon verte 
    9 | 3 | 3 | 1 | adidas chaussure rouge
    Donc la requête que je cherche doit m'afficher comme résultat la catégorie "pantalon", car d'après la table product, cette catégorie a 3 marques différentes (adidas, nike, puma) et que dans chacune de ces marques, il y a au moins 2 produits (pantalon rouge et pantalon vert pour adidas, pantalon rouge et pantalon vert pour nike, pantalon rouge et pantalon vert pour puma).

    Avez-vous une idée ?

    Merci d'avance pour vos réponses, cordialement

  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,
    Tu veux l'id_product, l'id_manufacturer, et l'id_category
    Code mysql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT id_product, c.id-category, m.id_manufacturer
    FROM product
    INNER JOIN category c USING (id_product)
    INNER JOIN manufacturer m USING (id_manufacturer)
    GROUP BY id_product, c.id-category, m.id_manufacturer
    Ensuite il te suffit de filtrer avec un clause HAVING
    Code mysql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    HAVING COUNT(DISTINCT m.id_manufacturer) >= 2
    AND COUNT(DISTINCT c.id_category)>=3
    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
    Membre régulier
    Inscrit en
    Février 2009
    Messages
    204
    Détails du profil
    Informations forums :
    Inscription : Février 2009
    Messages : 204
    Points : 123
    Points
    123
    Par défaut
    Bonjour,

    merci pour ta réponse, mais ça ne marche pas.

    Je sais que la requête qui permet d'avoir les noms de catégories qui ont plus de 3 marques différentes dans la table product est :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT category.name 
    FROM category, product
    WHERE category.id_category = product.id_category 
    GROUP BY id_category 
    HAVING COUNT( DISTINCT id_manufacturer ) >3
    Mais cette requête ne me dit pas si chacune des différentes marques des catégories trouvées a au moins 2 produits dans la table product.

    Une idée ?

    Merci d'avance, cordialement

  4. #4
    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
    Alors il faut faire le comptage des id_manufacturer dans une sous-requêtes corrélée sur l'id_product et l'id_category.
    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)

  5. #5
    Membre régulier
    Inscrit en
    Février 2009
    Messages
    204
    Détails du profil
    Informations forums :
    Inscription : Février 2009
    Messages : 204
    Points : 123
    Points
    123
    Par défaut
    Rebonjour,

    merci pour ta réponse, mais j'ai cherché à faire ce que tu m'as dit pendant des heures, mais j'ai pas réussi à trouver la requête miracle.

    En tout cas j'ai 2 pistes :

    1) Je sais que la requête qui permet d'avoir les noms de catégories qui ont plus de 3 marques différentes dans la table product est :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT category.name 
    FROM category, product
    WHERE category.id_category = product.id_category 
    GROUP BY id_category 
    HAVING COUNT( DISTINCT id_manufacturer ) >3
    Mais cette requête ne me dit pas si chacune des différentes marques des catégories trouvées a au moins 2 produits dans la table product.

    2) et je sais que la requête qui permet d'avoir le nombre de marques différentes (manufacturer.name) d'une catégorie (id_category = 2 par exemple) qui ont au moins 2 produits dans la table product est :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
     
    SELECT COUNT(*) FROM (SELECT manufacturer.name
    			FROM manufacturer, product
    			WHERE manufacturer.id_manufacturer = product.id_manufacturer
    			AND product.id_category =  '2'
    			GROUP BY product.id_manufacturer
    			HAVING COUNT( DISTINCT product.id_product ) >= 2)
    Mais je ne parviens toujours pas à combiner les 2 requêtes.

    J'ai essayé avec ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT category.name, category.id_category, COUNT( DISTINCT id_manufacturer ) AS nombre_distinct_manufacturer, COUNT( DISTINCT id_product ) AS nombre_product
    FROM category, product 
    WHERE category.id_category = product.id_category 
    GROUP BY product.id_category, product.id_manufacturer
    HAVING nombre_distinct_manufacturer >3 
    AND nombre_product >2
    Mais je ne sais pas si c'est correct.

    Une idée ?

    Merci d'avance, cordialement.

  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
    Dans la table product, est-ce que le trio id_product, id_category, id_manufacturer constitue un index UNIQUE ?
    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
    Membre régulier
    Inscrit en
    Février 2009
    Messages
    204
    Détails du profil
    Informations forums :
    Inscription : Février 2009
    Messages : 204
    Points : 123
    Points
    123
    Par défaut
    Bonjour,

    non, seul id_product est unique car auto-incrémenté dans la table product.
    id_category et id_manufacturer peuvent être présents en plusieurs fois dans la table product.

    A+

  8. #8
    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
    Bon en raisonnant correctement, , j'arrive à cette proposition de requête
    Code mysql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    SELECT t1.produit
    FROM ( SELECT id_produt, id_category
           FROM product
           GROUP BY id_produt, id_category
           HAVING COUNT(*) => 3) t1
    INNER JOIN (SELECT id.product, id_category, ID_manufacturer
                FROM product
                GROUP BY  id.product, ID_manufacturer
                HAVING COUNT(*) => 2) t2
            USING (id_produt, id_category)
    Mais j'intuite qu'elle n'est pas très logique parce que le deuxième GROUP BY ne porte pas sur l'ensemble des colonnes du SELECT. D'ailleurs d'autres SGBD que MYSQL n'accepterait pas cette syntaxe.
    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)

  9. #9
    Membre régulier
    Inscrit en
    Février 2009
    Messages
    204
    Détails du profil
    Informations forums :
    Inscription : Février 2009
    Messages : 204
    Points : 123
    Points
    123
    Par défaut
    Merci, je vais tester ça.

    Je découvre maintenant que le language sql demande vraiment une logique pure.

    Je te tiens courant

  10. #10
    Membre régulier
    Inscrit en
    Février 2009
    Messages
    204
    Détails du profil
    Informations forums :
    Inscription : Février 2009
    Messages : 204
    Points : 123
    Points
    123
    Par défaut
    Au fait, excuse moi,

    à quoi correspond t1 et t2 svp ?

    A+

  11. #11
    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 totoAussi Voir le message
    Au fait, excuse moi,

    à quoi correspond t1 et t2 svp ?

    A+
    Ce sont des alias pour les sous-requêtes, de manière à pouvoir les utiliser comme des tables temporaires dans la requête principale.
    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)

  12. #12
    Membre régulier
    Inscrit en
    Février 2009
    Messages
    204
    Détails du profil
    Informations forums :
    Inscription : Février 2009
    Messages : 204
    Points : 123
    Points
    123
    Par défaut
    Ok, merci.

    Mais je crois que j'ai presque trouvé :

    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
     
     
    SELECT category.name, category.id_category, 
    (
    	SELECT COUNT(*) FROM 
    	(
    			SELECT product.id_manufacturer 
    			FROM product 
    			GROUP BY product.id_manufacturer
    			HAVING COUNT( DISTINCT product.id_product ) >= 2
    	)
     
    ) AS nombre_distinct_manufacturer
    FROM category, product
    WHERE category.id_category = product.id_category 
    GROUP BY product.id_category
    HAVING nombre_distinct_manufacturer >= 3
    Mais mysql m'affiche cette erreur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Every derived table must have its own alias
    Une idée ?

    Merci d'avance, cdt.

  13. #13
    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
    La sous-sous-requête n'est pas aliassée.
    Mais je doute que le résultat ait un sens, cette sous-sous-requête n'étant pas du tout corrélée.
    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)

  14. #14
    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
    trouver les noms des catégories à condition que le nombre de marques différentes dans chacune de ces catégories soit supérieur ou égal à 3
    On va d'abord se contenter de l'identifiant de la catégorie.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT id_category
    FROM product
    GROUP BY id_category
    HAVING COUNT(DISTINCT id_manufacturer) > 2
    Quelles sont ces marques ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    SELECT DISTINCT p.id_manufacturer
    FROM product p
    INNER JOIN
    (
        SELECT id_category
        FROM product
        GROUP BY id_category
        HAVING COUNT(DISTINCT id_manufacturer) > 2
    ) t ON t.id_category = p.id_category
    Parmi ces marques, quelles sont celles qui ont au moins deux produits ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    SELECT p.id_manufacturer
    FROM product p
    INNER JOIN
    (
        SELECT id_category
        FROM product
        GROUP BY id_category
        HAVING COUNT(DISTINCT id_manufacturer) > 2
    ) t ON t.id_category = p.id_category
    GROUP BY p.id_manufacturer
    HAVING COUNT(p.id_product) > 1
    Quels sont les produits de ces marques ?
    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
    SELECT p2.id_product
    FROM product p2
    INNER JOIN 
    (
        SELECT p.id_manufacturer
        FROM product p
        INNER JOIN
        (
            SELECT id_category
            FROM product
            GROUP BY id_category
            HAVING COUNT(DISTINCT id_manufacturer) > 2
        ) t1 ON t1.id_category = p.id_category
        GROUP BY p.id_manufacturer
        HAVING COUNT(p.id_product) > 1
    ) t2 ON t2.id_manufacturer = p2.id_manufacturer
    Quelles sont les catégories de ces produits ?
    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
    19
    20
    21
    22
    SELECT DISTINCT c.name AS category_name
    FROM category c
    INNER JOIN product p3 On p3.id_category = c.id_category
        INNER JOIN
        (
            SELECT p2.id_product
            FROM product p2
            INNER JOIN 
            (
                SELECT p.id_manufacturer
                FROM product p
                INNER JOIN
                (
                    SELECT id_category
                    FROM product
                    GROUP BY id_category
                    HAVING COUNT(DISTINCT id_manufacturer) > 2
                ) t1 ON t1.id_category = p.id_category
                GROUP BY p.id_manufacturer
                HAVING COUNT(p.id_product) > 1
            ) t2 ON t2.id_manufacturer = p2.id_manufacturer
        ) t3 ON t3.id_product = p3.id_product
    C'est peut-être simplifiable en prenant le problème par l'autre bout mais j'ai faim !
    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 !

Discussions similaires

  1. Réponses: 4
    Dernier message: 24/08/2011, 13h17
  2. [MySQL] Bonjour, je n'arrive pas à trouver la bonne requète mysql
    Par totoAussi dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 13/07/2011, 12h37
  3. [Tableaux] probleme je n'arrive pas à trouver l'erreur
    Par harlock59 dans le forum Langage
    Réponses: 21
    Dernier message: 06/06/2006, 14h43
  4. Réponses: 5
    Dernier message: 14/05/2006, 22h41
  5. Une parse error que j'arrive pas à trouver
    Par Kerweb dans le forum Langage
    Réponses: 3
    Dernier message: 27/03/2006, 12h25

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