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 :

Requête SQL dans resultat d'une autre. [MySQL]


Sujet :

PHP & Base de données

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    95
    Détails du profil
    Informations personnelles :
    Localisation : France, Puy de Dôme (Auvergne)

    Informations forums :
    Inscription : Mars 2009
    Messages : 95
    Par défaut Requête SQL dans resultat d'une autre.
    Bonjour,
    je n'arrive pas à faire ce que je voudrais dans une seule requête alors je voulais savoir si je pouvais le réaliser en deux requêtes.
    Quelques infos préalables:
    Structure de mes tables :
    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
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    CREATE TABLE CATEGORIES_TARIFS (
      categorie_tarif_id TINYINT UNSIGNED NOT NULL AUTO_INCREMENT,
      categorie_tarif_libelle VARCHAR(50) NOT NULL,
      UNIQUE(categorie_tarif_libelle),
      PRIMARY KEY (categorie_tarif_id)
    ) ENGINE=INNODB  DEFAULT CHARSET=latin1 ;
     
    CREATE TABLE TARIFS (
      tarif_id TINYINT UNSIGNED NOT NULL AUTO_INCREMENT,
      tarif_libelle VARCHAR(50) NOT NULL,
      categorie_tarif_id TINYINT UNSIGNED NOT NULL,
      tarif_prix DECIMAL(5,2) UNSIGNED NOT NULL,
      tarif_frais_port DECIMAL(5,2) UNSIGNED DEFAULT NULL,
      PRIMARY KEY (tarif_id),
      UNIQUE(tarif_id, categorie_tarif_id),
      UNIQUE(tarif_libelle, categorie_tarif_id),
      FOREIGN KEY(categorie_tarif_id) REFERENCES CATEGORIES_TARIFS(categorie_tarif_id) ON UPDATE CASCADE ON DELETE RESTRICT
    ) ENGINE=INNODB  DEFAULT CHARSET=latin1 ;
     
    CREATE TABLE GALERIE (
       galerie_id TINYINT UNSIGNED NOT NULL AUTO_INCREMENT,
       galerie_nom VARCHAR(50) NOT NULL,
       galerie_statut TINYINT(1) UNSIGNED NOT NULL DEFAULT 0,
       galerie_active TINYINT(1) UNSIGNED NOT NULL DEFAULT 0,
       galerie_demo TINYINT(1) UNSIGNED NOT NULL DEFAULT 0,
       galerie_date_creation TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
       categorie_tarif_id TINYINT UNSIGNED DEFAULT NULL,
       PRIMARY KEY(galerie_id),
       UNIQUE(galerie_nom),
       INDEX(categorie_tarif_id),
       FOREIGN KEY(categorie_tarif_id) REFERENCES CATEGORIES_TARIFS(categorie_tarif_id) ON UPDATE CASCADE ON DELETE RESTRICT
    ) TYPE=INNODB CHARACTER SET latin1 COLLATE latin1_swedish_ci;
     
     
    CREATE TABLE PHOTO (
       photo_id TINYINT UNSIGNED NOT NULL AUTO_INCREMENT,
       galerie_id TINYINT UNSIGNED,
       photo_nom VARCHAR(50),
       photo_fichier VARCHAR(150),
       photo_mini VARCHAR(150),
       photo_date_upload TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
       PRIMARY KEY(photo_id),
       UNIQUE(photo_nom),
       UNIQUE(photo_fichier),
       UNIQUE(photo_mini),
       FOREIGN KEY(galerie_id) REFERENCES GALERIE(galerie_id) ON UPDATE CASCADE ON DELETE RESTRICT
    ) TYPE=INNODB CHARACTER SET latin1 COLLATE latin1_swedish_ci;
    Ce que je voudrais réaliser:
    Je voudrais récupérer:
    • le nom de la photo
    • l'id de la galerie ainsi que son nom
    • les tarifs qui sont associés

    Tout ceci en fonction de l'id de la photo.
    Pour obtenir un tableau de ce type:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    $tabPhotos  
               Galerie xxxxx
                                photos: id=xxxx, nom=xxxxx
                                           id=xxxx, nom=xxxxx
                                           id=xxxx, nom=xxxxx
                                tarifs: nom:xxxxxx, prix:xxxx, port:xxxxxx
               Galerie yyyyy
                                photos: id=yyyy, nom=yyyy
                                           id=yyyy, nom=yyyy
                                           id=yyyy, nom=yyyy
                                tarifs: nom:yyyy, prix:yyyy, port:yyyyy
    Voici ce que j'ai réaliser (le principe) en php:
    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
     
    //-- Recherche des infos sur les photos sélectionnées
    foreach ($_SESSION['user']['panier'] as $id=>$photo)
    {  
      $sql= "SELECT photo_id, photo_nom, galerie_id, galerie_nom, categorie_tarif_id
             FROM PHOTO
             LEFT JOIN GALERIE USING(galerie_id)
             WHERE  photo_id = ". $id . " GROUP BY galerie_id";
      $result = mysql_query($sql);
     
      while($donnees=mysql_fetch_assoc($result))
      {
        $sql2="SELECT tarif_id FROM TARIFS WHERE categorie_tarif_id=".$donnees['categorie_tarif_id'];
        $result2 = mysql_query($sql2);
        while($test = mysql_fetch_assoc($result2))
          $tarifs[]=$test['tarif_id'];
      }
    }
    Ma question:
    Pourrait on faire le tout dans une même requête. Au cas échéant peut on (il semblerait que cela fonctionne), d'un point de vue optimisation surtout lancer une requête dans le traitement du résultat d'une autre requête ?

    Merci de m'avoir lu jusqu'au bout et merci d'avance pour vos réponses.

  2. #2
    Modérateur

    Avatar de MaitrePylos
    Homme Profil pro
    DBA
    Inscrit en
    Juin 2005
    Messages
    5 506
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : DBA
    Secteur : Service public

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 506
    Par défaut
    Ceci ne donne pas le résultat voulu ?

    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
     
    SELECT p.photo_id, p.photo_nom, galerie_id, galerie_nom, categorie_tarif_id
    FROM PHOTO p
    INNER JOIN GALERIE g
    ON p.galerie_id = g.galerie_id
    INNER JOIN TARIFS t 
    ON t.categorie_tarif_id = g.categorie_tarif_id
    WHERE p.photo_id = ". $id . " GROUP BY p.galerie_id"

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    95
    Détails du profil
    Informations personnelles :
    Localisation : France, Puy de Dôme (Auvergne)

    Informations forums :
    Inscription : Mars 2009
    Messages : 95
    Par défaut
    Merci de ta réponse mais je n'obtiens qu'un seul tarif hors il devrait y en avoir plusieurs.

    Il faut que je potasse tout ça.

    J'ai modifié comme ceci (je m'étais aperçu que mon exemple de code était erroné)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SELECT p.photo_id, p.photo_nom, p.galerie_id, g.galerie_nom, g.categorie_tarif_id, t.tarif_libelle, t.tarif_prix, t.tarif_frais_port
    FROM PHOTO p
    INNER JOIN GALERIE g
    ON p.galerie_id = g.galerie_id
    INNER JOIN TARIFS t 
    ON t.categorie_tarif_id = g.categorie_tarif_id
    WHERE p.photo_id = 8 GROUP BY p.galerie_id
    EDIT:Ce doit être le GROUP BY qui m'ennuie.
    J'y suis presque et en plus j'évite une boucle inutile:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT p.photo_id, p.photo_nom, p.galerie_id, g.galerie_nom, g.categorie_tarif_id, t.tarif_libelle, t.tarif_prix, t.tarif_frais_port
    FROM PHOTO p
    INNER JOIN GALERIE g ON p.galerie_id = g.galerie_id
    INNER JOIN TARIFS t ON t.categorie_tarif_id = g.categorie_tarif_id
    WHERE p.photo_id IN(1,2,3,4,5,6,8)
    Pour ce soir mes neurones sont rouges, alors je verrais demain.
    Merci pour la(es) piste(s).

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    95
    Détails du profil
    Informations personnelles :
    Localisation : France, Puy de Dôme (Auvergne)

    Informations forums :
    Inscription : Mars 2009
    Messages : 95
    Par défaut
    Bonjour,
    il semblerait que la requête ci dessus fonctionne. Quelques soucis pour mettre en forme mon tableau mais je vais bien y arriver.

    Merci encore.

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

Discussions similaires

  1. Réponses: 6
    Dernier message: 25/09/2009, 13h28
  2. Requête sql dans une clause Where
    Par PrinceMaster77 dans le forum Requêtes
    Réponses: 5
    Dernier message: 26/07/2006, 11h30
  3. Récupérer la valeur des champs calculés dans une requète SQL dans vba
    Par FrédéricCM dans le forum Requêtes et SQL.
    Réponses: 12
    Dernier message: 28/06/2006, 16h29
  4. [MySQL] Passer une requête SQL dans un tableau
    Par phpaide dans le forum PHP & Base de données
    Réponses: 5
    Dernier message: 02/05/2006, 11h09
  5. récupérer le résultat d'une requête sql dans un edit
    Par bertrand_declerck dans le forum Bases de données
    Réponses: 3
    Dernier message: 28/07/2005, 14h07

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