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 :

Requete pour selectionner des champs avec WHERE GROUP BY et ORDER BY


Sujet :

PHP & Base de données

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Homme Profil pro
    Educateur spécialisé
    Inscrit en
    Janvier 2012
    Messages
    238
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Janvier 2012
    Messages : 238
    Par défaut Requete pour selectionner des champs avec WHERE GROUP BY et ORDER BY
    Bonjour à tous et à toutes,
    Je vous demande de l'aide pour réaliser une requête avec une jointure.
    La première table est "tb_produits"
    Elle a 4 champs : "id" "url_onglet" "nom_produit" "affichage"
    "16" "objets-anciens" "Globe Terrestre Avec Boussole" "1"
    "17 "objets-anciens" "Gramophone Shellac" "1"
    "18 "objets-anciens" "carte du monde" "0"

    La deuxième table est "tb_images_produits
    Elle a 3 champs : "num_produit" "nom_img_produit" "odr_aff_img"
    17 mecanisme-gramophone-shellac.webp 30
    17 gramophone-shellac.webp 20
    17 gramophone-shellac.webp 10
    16 globe-terrestre.webp 10
    16 boussole-vieux-globe-terrestre.webp 20
    16 boussole-globe-terrestre.webp 30
    18 carte1.webp 10
    18 carte2.webp 20

    J'aimerais afficher seulement les images des produits ou le champ "affichage" est égale à 1 et une seul image, celle qui a le plus petit numéro dans le champ "odr_aff_img"

    Voici ma requete qui m'affiche une erreur (Error : SQLSTATE[42S22]: Column not found: 1054 Unknown column 'P.id' in 'field list')

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    $liste_img_nouveautes = $bdd->prepare('SELECT P.id,P.url_onglet, P.url_sous_onglet, P.nom_produit,P.affichage, I.num_produit, I.nom_img_produit,I.odr_aff_img FROM tb_produits 
    LEFT JOIN (SELECT nom_img_produit, MIN( odr_aff_img ) AS img FROM tb_images_produits GROUP BY num_produit) AS I ON P.id = I.num_produit
    WHERE P.affichage = :sugges_ok GROUP BY I.num_produit');
    $liste_img_nouveautes->bindValue('sugges_ok', 1, PDO::PARAM_INT);
    Merci de votre aide

  2. #2
    Expert confirmé
    Avatar de Séb.
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    5 347
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

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

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 347
    Billets dans le blog
    17
    Par défaut
    Dans le principe ta requête n'est pas bonne car tu cherches le plus petit ord_aff_img par nom_img_produit, alors qu'il le faut par num_produit.

    J'aimerais afficher seulement les images des produits ou le champ "affichage" est égale à 1 et une seul image, celle qui a le plus petit numéro dans le champ "odr_aff_img"
    Si le plus petit était toujours 10 et unique ce serait plus simple.

    tb_produits (§id, url_onglet, nom_produit, affichage)
    tb_images_produits (#num_produit, nom_img_produit, odr_aff_img)

    Il y a différentes manières de procéder, avec une sous-requête :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    $sql = <<<SQL
        select all num_produit, nom_img_produit
        from tb_images_produits
        where (num_produit, ord_aff_img) in (
            select all ip.num_produit, min(ip.odr_aff_img)
            from tb_produits as p
            inner join tb_images_produits as ip on p.id = ip.num_produit
            where p.affichage = 1
            group by 1
        )
        SQL;
    Cela ne marche que si tu as 1 seule image par produit avec un odr_aff_img minimal.

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

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

    Informations forums :
    Inscription : Janvier 2012
    Messages : 238
    Par défaut
    Bonjour Seb et merci de ton aide.
    Le souci c'est qu'il va y avoir plusieurs images pour le même produit et que le gars qui va entrer les images ne mettra pas forcement le numéro d'ordre d'affichage à 10.
    Aussi non comme tu la dis, ça serait plus simple.

  4. #4
    Membre éclairé
    Homme Profil pro
    Educateur spécialisé
    Inscrit en
    Janvier 2012
    Messages
    238
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Janvier 2012
    Messages : 238
    Par défaut
    J'arrive à le faire avec un foreach et une triche mes j'aimerais comprendre comment le faire avec une simple requete
    Exemple
    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
    23
    24
    25
    26
    27
     
    <?php
    $liste_img_nouveautes= $bdd->prepare("SELECT id,nom_produit,nom_img_produit FROM tb_produits LEFT JOIN tb_images_produits ON tb_produits.id = tb_images_produits.num_produit WHERE affichage= :sugges_ok ORDER BY odr_aff_img ASC");
    $liste_img_nouveautes->bindValue('sugges_ok', 1, PDO::PARAM_INT);
    try {
    		$liste_img_nouveautes->execute();
    		$nbr_produit = $liste_img_nouveautes->rowCount();
    	}
    catch (PDOException $e)
    	{
    	   echo 'Error : ' . $e->getMessage();
    	   die();
    	}
    while ($retour_produits = $liste_img_nouveautes->fetch())
    	{
    		$prod[$retour_produits['id']][]= $retour_produits;
    	}
    foreach($prod as $key => $value) {
    	foreach($value as $key1 => $value1) {
    		if($num_id!=$value[$key1]['id']) {
    			$num_id=$value[$key1]['id'];
    			echo''.$value[$key1]['nom_produit'].'<br/>';
    			echo''.$value[$key1]['nom_img_produit'].'<br/>';
    		}
    	}
    }
    ?>

  5. #5
    Expert confirmé
    Avatar de Séb.
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    5 347
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

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

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 347
    Billets dans le blog
    17
    Par défaut
    Le souci c'est qu'il va y avoir plusieurs images pour le même produit et que le gars qui va entrer les images ne mettra pas forcement le numéro d'ordre d'affichage à 10.
    Et bien ma requête devrait fonctionner, il faudra juste s'assurer qu'il n'y ait pas 2 ord_aff_img égaux pour un même produit.

    Tu peux ajouter une contrainte d'unicité à la table :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    alter table tb_images_produits
    add unique (num_produit, ord_aff_img);

  6. #6
    Membre éclairé
    Homme Profil pro
    Educateur spécialisé
    Inscrit en
    Janvier 2012
    Messages
    238
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Janvier 2012
    Messages : 238
    Par défaut
    Je ne peux pas être sur qu'il n'y ai pas deux "ord_aff_img" égaux pour un même produit.
    Même si mon code est fait de façon à ajouter 10 à chaque fois qu'on ajoute un image pour le même produit j'ai laissé la possibilité de modifier l'ordre d'affichage des images du coup la requête complète devrait ressembler à quoi ?
    Aussi non je laisse le foreach qui fonctionne bien mais je reste sur ma faim (mon incompréhension) alors que je sais qu'on peux le faire avec une requête lol

Discussions similaires

  1. Aide pour insérer des champs d'une requete dans une table
    Par salluste dans le forum Requêtes et SQL.
    Réponses: 3
    Dernier message: 24/06/2014, 02h48
  2. Compter des ROWS avec un group by et un WHERE
    Par Olivierl20 dans le forum Requêtes
    Réponses: 6
    Dernier message: 16/10/2013, 22h14
  3. Réponses: 2
    Dernier message: 15/02/2010, 01h07
  4. Besoin d'aide avec une requete pour récupérer des hyperliens
    Par scaleo dans le forum XSL/XSLT/XPATH
    Réponses: 8
    Dernier message: 21/12/2007, 12h56
  5. [MySQL] problème avec if pour insérer des champs
    Par nerazzurri dans le forum PHP & Base de données
    Réponses: 16
    Dernier message: 23/05/2007, 12h59

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