Création d'un select avec le données d'une DB Mysql

Eléphanteau du PHP | 36 Messages

28 nov. 2006, 14:19

Bonjour @ tous,

est-il possible de créer un select à partir de 2 requêtes.

Je sais le faire sur une requête simple du genre
echo"<select>";
$result=mysql_query("SELECT NomProduit FROM produits");
while ($row = mysql_fetch_row($result)) {
echo"<option>$row[0]</option>";
    }
echo"</select>";
Avec ce code, je récupère donc le nom de tous mes produits dans ce select. J'aimerai récupérer tous mes produits avec les options associé à ces produits.

Chaque option de chaque produit se trouve dans une autre table appellé OptionProduit et ces options sont lié via avec la table produit via le N° Id du produit.

Pour résumer actuellement dans mon select je récupère ceci
NomProduit1
NomProduit2
NomProduit3
Etc

Ce que je souhaite faire c'est
NomProduit1
Option1
Option2

NomProduit2

NomProduit3
Option1

Etc


Si quelqu'un peut m'aider ???



Merci d'avance.
Modifié en dernier par bercy le 30 nov. 2006, 11:31, modifié 2 fois.

ViPHP
ViPHP | 1961 Messages

28 nov. 2006, 14:45

Bonjour,

La première chose à faire est de modiffier ta requête pour quelle te donne les informations nécessaires, tu dois lier les deux tables soit par jointure (JOINT) soit avec la clause WHERE.

Un exp. avec WHERE

Code : Tout sélectionner

SELECT NomProduit, ta_col_dans_OptionProduit FROM produit, OptionProduit WHERE OptionProduit.idProduit = produit.idProduit
Fais afficher le résultat et tu véras ce qu'il faut faire en PHP/HTML pour obtenir le résultat escompté.

Une petite indication, pense à 'option group' de HTML
Deux choses sont infinies, l'Univers et la sottise humaine!!
Mais je ne suis pas sur de ce que j'affirme au sujet de l'Univers.

A. Einstein

Mammouth du PHP | 1776 Messages

28 nov. 2006, 14:47

Code : Tout sélectionner

SELECT p.NomProduit,o.Option FROM produits AS p, OptionProduit AS o WHERE p.Id=o.Id GROUP BY o.Option
Me semble que ça peut être correct...en tout cas, ca affichera noproduit seulement si il a au minimum une option :roll:

ViPHP
ViPHP | 1961 Messages

28 nov. 2006, 14:54

Effectivement, manque la clause GROUP BY.

Merci LHDN92!
Deux choses sont infinies, l'Univers et la sottise humaine!!
Mais je ne suis pas sur de ce que j'affirme au sujet de l'Univers.

A. Einstein

Modérateur PHPfrance
Modérateur PHPfrance | 2575 Messages

28 nov. 2006, 14:58

Code : Tout sélectionner

SELECT p.NomProduit,o.Option FROM produits AS p, OptionProduit AS o WHERE p.Id=o.Id GROUP BY o.Option
Me semble que ça peut être correct...en tout cas, ca affichera noproduit seulement si il a au minimum une option :roll:
Effectivement, mais le group by est manquant : il faut grouper par NomProduit et par Option (Group By p.NomProduit, o.Option)

Mais pour forcer l'extraction des produits qui n'ont pas d'options il faut utiliser une jointure externe à gauche (du côté de la table produits) ce qui donne :

Code : Tout sélectionner

SELECT p.NomProduit,o.Option FROM produits AS p left join OptionProduit AS o On p.Id=o.Id GROUP BY p.NomProduit, o.Option
NB. Dans tous les cas, le résultat de la requête retourne des doublons de noms pour toutes les options d'un même produit
Ce n'est qu'au niveau PHP que tu pourras éviter de retraiter les noms en double
--------//////----//---//----//////
-------//---//----//---//----//---//
------//////----//////-----//////
-----||--------||--||---||
Prendre le recul n'est pas une perte de temps.


ps: Affrontez moi dans l'arène

Eléphanteau du PHP | 36 Messages

28 nov. 2006, 22:14

Ce forum est vraiment une bible.

Je vous remercie pour votre aide

Voici ce qui fonctionne pour moi

Code : Tout sélectionner

SELECT p.NomProduit,o.Option FROM produits AS p left join OptionProduit AS o On p.Id=o.Id GROUP BY p.NomProduit, o.Option
puis avec l'option optgroup de HTML, je fais ma sauce.

Une dernière question concernant ce sujet, si je souhaite EN PLUS faire un filtre WHERE sur p.NomProduit quel serai la syntaxe

Code : Tout sélectionner

SELECT p.NomProduit,o.Option FROM produits WHERE Etat = 1 AS p left join OptionProduit AS o On p.Id=o.Id GROUP BY p.NomProduit, o.Option
Merci encore.

Invité
Invité n'ayant pas de compte PHPfrance

30 nov. 2006, 11:33

J'ai trouvé il suffit de mettre la clause WHERE avant le GROUP BY

SELECT p.NomProduit,o.Option
FROM produits AS p left join OptionProduit AS o On p.Id=o.Id WHERE Etat = 1
GROUP BY p.NomProduit, o.Option


Merci @ vous tous