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 :

requêtes MYSQL imbriquées


Sujet :

Requêtes MySQL

  1. #1
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Juin 2010
    Messages
    3
    Détails du profil
    Informations personnelles :
    Âge : 56
    Localisation : France

    Informations forums :
    Inscription : Juin 2010
    Messages : 3
    Points : 1
    Points
    1
    Par défaut requêtes MYSQL imbriquées
    Bonjour tout le monde !

    Soit une table matable (fictive, c'est juste pour l'exemple) avec les champs:

    1 - id_produit (une référence)
    2 - prix (admettons pour l'exemple qu'il n'y ait pas 2 prix identiques)
    3 - pays (france, iltalie, espagne)
    4 - couleur (bleu, rouge, verte)

    Mon problème:
    1/ je fais une requête
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT MIN(prix) AS prix_mini FROM matable WHERE pays=france AND couleur=bleu
    pour trouver le prix minimum de tous les produits francais de couleur bleu

    2/ je fais une deuxième requête :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT (id_produit) FROM matable WHERE prix=prix_mini
    pour trouver la référence du produit francais de couleur bleu qui a le prix le moins cher.

    Donc vous l'avez déjà compris, mon but est d'extraire l'id_produit (et seulement lui) du produit bleu le moins cher de france.

    Je suis sûr que l'on peut faire cela en une seule requête du style:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT (id_produit) FROM matable WHERE prix=SELECT MIN(prix) AND pays=france AND couleur=bleu
    Après avoir testé plusieurs syntaxe je suis toujours dans les choux !

    Comment coder le WHERE prix=SELECT MIN(prix) ??? et associer ensuite les 2 autres critères...

    (base en mysql, appli php)

    Merci par avance de vos suggestions éclairées !

  2. #2
    Membre confirmé Avatar de nounetmasque
    Inscrit en
    Janvier 2003
    Messages
    494
    Détails du profil
    Informations forums :
    Inscription : Janvier 2003
    Messages : 494
    Points : 570
    Points
    570
    Par défaut
    Essaye la requête suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    SELECT id_produit
    FROM matable, (
         SELECT MIN(prix) AS prix_mini 
         FROM matable 
         WHERE pays = france 
         AND couleur = bleu
    ) as tablePrix
    WHERE matable.prix = tablePrix.prix_mini;
    "Dieu reste muet, si seulement nous pouvions convaincre l'être humain d'en faire autant."

  3. #3
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Juin 2010
    Messages
    3
    Détails du profil
    Informations personnelles :
    Âge : 56
    Localisation : France

    Informations forums :
    Inscription : Juin 2010
    Messages : 3
    Points : 1
    Points
    1
    Par défaut
    merci pour ta réponse mais ca ne marche pas.
    Résultat vide !

  4. #4
    Membre confirmé Avatar de nounetmasque
    Inscrit en
    Janvier 2003
    Messages
    494
    Détails du profil
    Informations forums :
    Inscription : Janvier 2003
    Messages : 494
    Points : 570
    Points
    570
    Par défaut
    J'avoue avoir oublié quelques conditions dans le WHERE :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    SELECT matable.* 
    FROM matable, (
         SELECT MIN(prix) AS prix_mini 
         FROM matable 
         WHERE pays = 'France'
         AND couleur = 'Bleu'
    ) as tablePrix
    WHERE matable.pays = 'France'
    AND matable.couleur = 'Bleu'
    AND matable.prix = tablePrix.prix_mini
    "Dieu reste muet, si seulement nous pouvions convaincre l'être humain d'en faire autant."

  5. #5
    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
    Plus simple je pense :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    SELECT id_produit
    FROM ma_table
    WHERE pays = 'France'
      AND couleur = 'bleu'
      AND prix = (
        SELECT MIN(prix)
        FROM ma_table
        WHERE pays = 'France'
          AND couleur = 'bleu'
      )
    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 !

  6. #6
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Juin 2010
    Messages
    3
    Détails du profil
    Informations personnelles :
    Âge : 56
    Localisation : France

    Informations forums :
    Inscription : Juin 2010
    Messages : 3
    Points : 1
    Points
    1
    Par défaut
    merci encore pour vos réponses

    Malheureusement, j'ai testé les 2, et ... résultat vide dans les 2 cas.

    En plus je ne comprends pas pourquoi vous mettez 2 fois les clauses WHERE 'pays' et 'couleurs' puisque dans l'absolu le

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT MIN(prix)
    FROM ma_table
    WHERE pays = 'France'
    AND couleur = 'bleu'
    tri déjà sur ces critères.

    Mais bon je ne suis pas un pro des requetes SQL alors j'ai testé vos propositions mais que nenni ...
    En grattant sur le net j'ai cru comprendre que lorsque l'on veut mettre une clause du style MIN ou MAX, il ne faut pas employer WHERE mais HAVING...

    Je vais finir par aller prendre un doliprane

  7. #7
    Membre confirmé Avatar de nounetmasque
    Inscrit en
    Janvier 2003
    Messages
    494
    Détails du profil
    Informations forums :
    Inscription : Janvier 2003
    Messages : 494
    Points : 570
    Points
    570
    Par défaut
    Citation Envoyé par CinePhil Voir le message
    Plus simple je pense :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    SELECT id_produit
    FROM ma_table
    WHERE pays = 'France'
      AND couleur = 'bleu'
      AND prix = (
        SELECT MIN(prix)
        FROM ma_table
        WHERE pays = 'France'
          AND couleur = 'bleu'
      )

    Question par rapport à cette requête, n'est-elle pas plus gourmande car il me semble que le SELECT est exécuté autant de fois qu'il y a de lignes dans la table ma_table non ?

    Citation Envoyé par nico_63 Voir le message
    merci encore pour vos réponses

    Malheureusement, j'ai testé les 2, et ... résultat vide dans les 2 cas.
    Pourrait-on avoir un exemple de données car j'ai testé la requête et elle renvoie bien quelque chose.


    Citation Envoyé par nico_63 Voir le message
    En plus je ne comprends pas pourquoi vous mettez 2 fois les clauses WHERE 'pays' et 'couleurs'
    La première condition sur le pays et la couleur permet de sélectionner le plus petit prix pour la France de couleur bleu. Si tu fais uniquement la jointure sur le prix, tu va te retrouver avec des produit d'autres pays et d'autres couleurs d'où la deuxième utilisation des critères de sélection.
    "Dieu reste muet, si seulement nous pouvions convaincre l'être humain d'en faire autant."

  8. #8
    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
    Citation Envoyé par nounetmasque Voir le message
    Question par rapport à cette requête, n'est-elle pas plus gourmande car il me semble que le SELECT est exécuté autant de fois qu'il y a de lignes dans la table ma_table non ?
    En principe non, et heureusement !
    L'optimiseur du SGBD exécutera 1 fois la sous requête et stockera le résultat du calcul pour tester la comparaison avec les valeurs des lignes de la requête principale.
    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. Requète MySQL >> Postgresql
    Par genova dans le forum PostgreSQL
    Réponses: 3
    Dernier message: 19/08/2005, 09h05
  2. Requête MYSQL LIKE particulière
    Par TheDarkLewis dans le forum Requêtes
    Réponses: 9
    Dernier message: 05/12/2004, 15h50
  3. Arrêt de l'exécution d'une requête MySQL dans DELPHI.
    Par joelmarc dans le forum Bases de données
    Réponses: 9
    Dernier message: 11/10/2004, 16h11
  4. surcharge de requête MySQL
    Par simoryl dans le forum Requêtes
    Réponses: 4
    Dernier message: 15/06/2004, 10h43
  5. requête mysql sous php
    Par remi59 dans le forum Débuter
    Réponses: 9
    Dernier message: 03/07/2003, 10h39

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