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

PHP & Base de données Discussion :

amélioration d'une requête


Sujet :

PHP & Base de données

  1. #1
    Membre régulier
    Homme Profil pro
    Educateur spécialisé
    Inscrit en
    Janvier 2012
    Messages
    208
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Educateur spécialisé
    Secteur : Santé

    Informations forums :
    Inscription : Janvier 2012
    Messages : 208
    Points : 118
    Points
    118
    Par défaut amélioration d'une requête
    Bonjour à tous et à toutes,
    J'aimerais avoir un avis pour savoir si ma requête est faite correctement.
    Je m'explique, j'ai deux table : "produit" et "images_monture".
    Comme les noms l'indique dans la table produit j'ai une liste de produit avec un identifiant unique et dans la table images_monture j'ai des noms d'image avec une colonne "num_monture" qui correspond à l'identifiant "id" de la table produit.
    Comme il peut y avoir plusieurs image pour un même produit et que je veux afficher que la première image j'ai fait un GROUP BY.

    La requête fonctionne comme je veux mais il me semble qu'il y a un LEFT JOIN en trop.
    Quand dites-vous ?
    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
     
    $affichage_produits = $bdd->prepare('SELECT P.id, P.nom_onglet_pro, P.nom_rubrique_pro, P.nom_sous_rub_pro, P.nom_monture, P.tarif, P.stock, M.num_monture, I.num_monture, I.nom_img_monture, I.odr_aff_img FROM produits 
    AS P INNER JOIN images_monture AS M ON P.id = M.num_monture 
    LEFT JOIN (SELECT num_monture, MIN( odr_aff_img ) AS img FROM images_monture GROUP BY num_monture) 
    AS MI ON P.id = MI.num_monture 
    LEFT JOIN images_monture AS I ON P.id = I.num_monture AND MI.img = I.odr_aff_img 
    WHERE P.lien_onglet_pro = :lien_page AND P.lien_rub_prod = :lien_rub AND P.lien_sous_rub_pro = :lien_sous_rub GROUP BY I.num_monture
    ORDER BY P.nom_monture ASC');
     
    $affichage_produits->bindValue('lien_page', $page, PDO::PARAM_STR);
    $affichage_produits->bindValue('lien_rub', $choix_decode, PDO::PARAM_STR);
    $affichage_produits->bindValue('lien_sous_rub', $action_decode, PDO::PARAM_STR);
    try
    	{
    		$affichage_produits->execute();
    		$total_image = $affichage_produits->rowCount();
    	}
    catch (PDOException $e) {
    	echo 'Error : ' . $e->getMessage();
    	die();
    	}
    Merci.

  2. #2
    Expert éminent Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    Mars 2009
    Messages
    2 858
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Justicier interdimensionnel

    Informations forums :
    Inscription : Mars 2009
    Messages : 2 858
    Points : 6 556
    Points
    6 556
    Par défaut
    [edit]Ma réponse est complètement fausse (du fait du GROUP BY et de la colonne nom_img_monture dans le SELECT qui s'y rapporte). Ne pas tenir compte de cette ânerie, désolé[/edit]

    Citation Envoyé par moi
    Comme ça, ça ne serait pas suffisant?
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    SELECT P.id, P.nom_onglet_pro, P.nom_rubrique_pro, P.nom_sous_rub_pro,
           P.nom_monture, P.tarif, P.stock,
           M.nom_img_monture
    FROM produits P
    INNER JOIN (
        SELECT num_monture, MIN(odr_aff_img), nom_img_monture
        FROM images_monture
        GROUP BY num_monture
    ) M
      ON P.id = M.num_monture
    WHERE P.lien_onglet_pro = :lien_page
      AND P.lien_rub_prod = :lien_rub
      AND P.lien_sous_rub_pro = :lien_sous_rub
    ORDER BY P.nom_monture ASC

    lien_rub_prod ou lien_rub_pro ?

    Au passage, j'espère qu'un produit ne peut appartenir qu'à une seule rubrique/sous rubrique.
    Brachygobius xanthozonus
    Ctenobrycon Gymnocorymbus

  3. #3
    Membre régulier
    Homme Profil pro
    Educateur spécialisé
    Inscrit en
    Janvier 2012
    Messages
    208
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Educateur spécialisé
    Secteur : Santé

    Informations forums :
    Inscription : Janvier 2012
    Messages : 208
    Points : 118
    Points
    118
    Par défaut
    Merci CosmoKnacki pour ta correction.
    C'est bien lien_rub_prod je me suis trompé en écrivant le champ dans la table mais comme toute la partie admin est déjà faite, j'ai pas le courage de modifier toutes les requêtes.

    Pour répondre à ta question "Au passage, j'espère qu'un produit ne peut appartenir qu'à une seule rubrique/sous rubrique. "
    Oui un produit ne peut pas appartenir à plusieurs rubrique ou sous rubrique par contre il y a plusieurs produit par rubrique et sous rubrique.

    Encore merci.

  4. #4
    Expert éminent
    Avatar de Séb.
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    5 101
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 101
    Points : 8 211
    Points
    8 211
    Billets dans le blog
    17
    Par défaut
    Si la 1re image de chaque produit a un odr_aff_img toujours à 1
    et qu'aucune autre image du produit n'est également à odr_aff_img = 1
    et que chaque produit a au moins 1 image
    alors je ferais simplement :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    $affichage_produits = <<<SQL
        SELECT ALL
            P.id, P.nom_onglet_pro, P.nom_rubrique_pro, P.nom_sous_rub_pro,
            P.nom_monture, P.tarif, P.stock,
            M.nom_img_monture
        FROM produits AS P
        INNER JOIN images_monture AS M ON P.id = M.num_monture AND M.odr_aff_img = 1
        WHERE TRUE
            AND P.lien_onglet_pro = :lien_page
            AND P.lien_rub_prod = :lien_rub
            AND P.lien_sous_rub_pro = :lien_sous_rub
        ORDER BY P.nom_monture ASC
        SQL;
    Si tu nommes tes fichiers "<id-monture>-<ordre-affichage>.jpeg" tu peux même directement taper sur le 1er fichier sans requête.

    (EDIT : grilled)
    Un problème exposé clairement est déjà à moitié résolu
    Keep It Smart and Simple

  5. #5
    Membre régulier
    Homme Profil pro
    Educateur spécialisé
    Inscrit en
    Janvier 2012
    Messages
    208
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Educateur spécialisé
    Secteur : Santé

    Informations forums :
    Inscription : Janvier 2012
    Messages : 208
    Points : 118
    Points
    118
    Par défaut
    Merci Seb pour ta réponse mais les images ne sont pas toujours égale à 1 et il ce peut que ça devienne vite le bordel quand celui qui va gérer le site va commencer à mettre ses numéros d'affichage. lol
    En plus il n'est pas forcément sur que chaque produit aura une images.
    Je vais laisser comme ça, je pense que la requête de CosmoKnacki est bien propre.

    Merci quand même.

  6. #6
    Expert éminent
    Avatar de Séb.
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    5 101
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 101
    Points : 8 211
    Points
    8 211
    Billets dans le blog
    17
    Par défaut
    S'il n'y a pas toujours au moins 1 image alors il faut utiliser un OUTER JOIN
    Un problème exposé clairement est déjà à moitié résolu
    Keep It Smart and Simple

  7. #7
    Expert éminent Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    Mars 2009
    Messages
    2 858
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Justicier interdimensionnel

    Informations forums :
    Inscription : Mars 2009
    Messages : 2 858
    Points : 6 556
    Points
    6 556
    Par défaut
    Désolé, le code que j'ai posté précédemment est archi-faux, ne pas en tenir compte.

    Donc pour revenir à la question de départ: tu peux virer le INNER JOIN images_monture AS M ON P.id = M.num_monture et bien sûr le M.num_monture dans le SELECT principal ainsi que le dernier GROUP BY.

    Ce qui donne:
    Code SQL : 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 P.id, P.nom_onglet_pro, P.nom_rubrique_pro, P.nom_sous_rub_pro,
           P.nom_monture, P.tarif, P.stock,
           I.nom_img_monture, I.odr_aff_img
    FROM produits AS P
    LEFT JOIN (
        SELECT num_monture, MIN( odr_aff_img ) AS img 
        FROM images_monture
        GROUP BY num_monture
    ) AS MI
        ON P.id = MI.num_monture 
    LEFT JOIN images_monture AS I
        ON P.id = I.num_monture
       AND MI.img = I.odr_aff_img 
    WHERE P.lien_onglet_pro = :lien_page
      AND P.lien_rub_prod = :lien_rub
      AND P.lien_sous_rub_pro = :lien_sous_rub
    ORDER BY P.nom_monture ASC
    Brachygobius xanthozonus
    Ctenobrycon Gymnocorymbus

  8. #8
    Membre régulier
    Homme Profil pro
    Educateur spécialisé
    Inscrit en
    Janvier 2012
    Messages
    208
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Educateur spécialisé
    Secteur : Santé

    Informations forums :
    Inscription : Janvier 2012
    Messages : 208
    Points : 118
    Points
    118
    Par défaut
    Merci CosmoKnacki,
    j'ai modifié mais ta première solution avait l'air de fonctionner et elle était plus simple.
    Je vais faire des test.

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

Discussions similaires

  1. Amélioration d'une requête
    Par j-hadd dans le forum Requêtes
    Réponses: 0
    Dernier message: 22/11/2016, 09h44
  2. [2012] Aide à l'amélioration d'une requête
    Par MRzaa dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 30/03/2014, 12h08
  3. Amélioration d'une requête
    Par Jefty dans le forum Langage SQL
    Réponses: 13
    Dernier message: 09/06/2012, 15h22
  4. Amélioration d'une requête
    Par Redg9 dans le forum Requêtes
    Réponses: 8
    Dernier message: 29/07/2009, 11h18
  5. Amélioration d'une requête
    Par phtpht dans le forum Langage SQL
    Réponses: 3
    Dernier message: 27/07/2006, 12h20

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