Je poste aujourd'hui pour savoir comment faire une requête car je n'arrive pas à avoir le résultat escompté.
J'ai une table lm_produits qui contient des produits avec le détail sur chaque produit, une table odl_marques qui contient la marque du produit en question et j'ai une table odl_images_monture qui contient les images des produits.
Tout est lié par des numéros.
Le souci c'est qu'il y a plusieurs image par produit et que je voudrais afficher seulement la première.
J'ai essayer la requête suivante mais l'image affichée n'est pas la première.
<?php
$affichage_produits = $bdd->prepare('SELECT id, nom_marq, nom_monture, nom_url, stock, nom_img_monture, odr_aff_img
FROM lm_produits
LEFT JOIN odl_images_monture ON lm_produits.id = odl_images_monture.num_monture
LEFT JOIN odl_marques ON lm_produits.marque = odl_marques.lien_marq
WHERE collection = :coll GROUP BY nom_monture ORDER BY ordre_aff_prod, odr_aff_img ASC');
$affichage_produits->bindValue('coll', $page, PDO::PARAM_STR);
?>
Il y a bien qu'une image qui s'affiche mais le odr_aff_img n'est pas pris en compte.
Si j’enlève le GROUP BY, les images sont dans l'ordre mais elles s'affichent toutes.
Le sujet est déplacé de la section PHP vers la section Base de données
sergio_zero a écrit:
l'image affichée n'est pas la première
Non, c'est une image au hasard ... un peu de lecture pour explication ...
sergio_zero a écrit:
je voudrais afficher seulement la première
As-tu un moyen d'identifier "la première", l'enregistrement correspondant dans la table image a-t-il un signe distinctif ? id le plus petit ? date de création la plus petite ? colonne ordre = 1 ?
Autres remarques :
N'utilises de jointures externes que lorsque c'est nécessaire
Utilises des alias pour simplifier l'écriture de la requête et améliorer la lisibilité pour les autres
Oui, les explications dans le lien donné plus tôt.
sergio_zero a écrit:
il y a ord_aff_img qui est un numéro d'ordre d'affichage
Je ne connais pas la structure des 3 tables en jeu (puisque tu n'utilises pas d'alias), donc je te propose ceci aux erreurs près de positionnement de champs :
SELECT
P.id,
M.nom_marq,
P.nom_monture,
P.nom_url,
P.stock,
I.nom_img_monture,
I.odr_aff_img
FROM
lm_produits AS P
INNER JOIN odl_marques AS M
ON P.marque = M.lien_marq
LEFT JOIN (
-- Numéro mini par monture
SELECT
num_monture,
MIN( odr_aff_img ) AS img
FROM odl_images_monture
GROUP BY num_monture
) AS MI
ON P.id = MI.num_monture
LEFT JOIN odl_images_monture AS I
ON MI.num_monture = I.num_monture
AND MI.img = I.odr_aff_img
WHERE P.collection = :coll
GROUP BY P.nom_monture
ORDER BY P.ordre_aff_prod
Je fais une sous-requête pour calculer par monture le numéro d'affichage minimum, puis je joint tout cela au reste.
J'ai mis une jointure interne (INNER) vers la table des marques car j'ai supposé que tout produit a une marque définie.
J'ai mis une jointure externe (LEFT) vers les images pour quand même afficher les produits qui n'aurait pas d'image.
Attention si pour une même monture il y a deux images avec le même odr_aff_img minimum, alors tu auras des doublons ... à toi de t'assurer que cela ne puisse se produire ...
× Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
× Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
Création de site internet dansle7.fr Référencement et publicité gratuites sur commercesdu7.fr
Création de site internet dansle7.fr Référencement et publicité gratuites sur commercesdu7.fr
Création de site internet dansle7.fr Référencement et publicité gratuites sur commercesdu7.fr
Création de site internet dansle7.fr Référencement et publicité gratuites sur commercesdu7.fr