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.