Jointure de tables

Invité
Invité n'ayant pas de compte PHPfrance

22 sept. 2008, 01:56

Bonjour à tous,

j'ai une table "offres" constituée comme ceci:

Code : Tout sélectionner

CREATE TABLE `offre` ( `id` int(10) unsigned NOT NULL auto_increment, `name` varchar(155) NOT NULL default '', `days` int(10) unsigned NOT NULL default '0', `price` float(10,2) NOT NULL default '0.00', `description` text NOT NULL
et une table "params" qui stocke une série de paramètres valant 0 ou 1, pour chaque offre

Code : Tout sélectionner

CREATE TABLE `params` ( `id` int(10) unsigned NOT NULL auto_increment, `idoffre` int(10) NOT NULL default '0', `param1` tinyint(1) NOT NULL default '0', `param2` tinyint(1) NOT NULL default '0', `param3` tinyint(1) NOT NULL default '0'
Vous l'avez compris, offre.id est égal à params.idoffre pour chaque enregistrement.
Pour sélectionner toutes les offres qui ont des paramètres, je fais ceci:

Code : Tout sélectionner

SELECT * FROM offres, params WHERE offres.id = params.idoffre
Je traite ensuite chaque enregistrement avec mysql_fetch_array sans difficultés.

Mon problème: certaines de mes offres n'ont pas encore de paramètres définis.
La table "offres" peut donc contenir un enregistrement qui n'est pas associé dans "params".

Ma question: comment construire une requete qui liste toutes les offres de la table "offres", en récupérant les paramètres s'il y en a dans "params", et en mettant une valeur par défaut s'il n'y a pas de paramètres?

Merci pour vos réponses.

Invité
Invité n'ayant pas de compte PHPfrance

22 sept. 2008, 02:18

en gros, comment tester l'absence d'enregistrement dans une table, et mettre des valeurs par défaut pour chaque champ s'il n'y a pas d'enregistrement?

Modérateur PHPfrance
Modérateur PHPfrance | 2575 Messages

22 sept. 2008, 06:29

C'est ce qu'on appelle : une jointure externe à gauche où l'on peut joindre la table offre à la table params pour avoir un sens de jointure de la gauche (offre) vers la droite (params) ce qui signifie que l'on veut inclure tous les enregistrements de la table offre et seulement ceux de la table params qui sont associés. De cette manière, les enregistrements de la table offre qui ne sont pas associés à params apparaissent avec une association NULL dans params.

Cela s'écrit :

Code : Tout sélectionner

SELECT * FROM offre LEFT JOIN params ON offre.id = params.idoffre
Remarque:
  • Comme on peut faire une jointure à gauche (LEFT JOIN) on peut faire aussi une jointure à droite (RIGHT JOIN)
    Le sens de la jointure externe à gauche ou à droite est important et dépend de l'ordre des tables dans la clause FROM
--------//////----//---//----//////
-------//---//----//---//----//---//
------//////----//////-----//////
-----||--------||--||---||
Prendre le recul n'est pas une perte de temps.


ps: Affrontez moi dans l'arène

Invité
Invité n'ayant pas de compte PHPfrance

22 sept. 2008, 11:16

meci bcp, ça marche.
Petite question sur les valeurs null.

Mon fetch array me donne ceci quand aucun paramètre n'est trouvé dans la table "params":
[param1] =>
[param2] =>
[param3] =>

Y at-il un moyen de mettre une valeur par défaut dans l'array pour les params vides, à partir de sql?
Quelquechose comme "null", "NULL"...[/php]

Modérateur PHPfrance
Modérateur PHPfrance | 2575 Messages

22 sept. 2008, 18:29

ça ne sert à rien de le mettre au niveau SQL, le nul est un vide, tu peux l'interpréter au niveau de ton programme PHP comme tu veux.

Par exemple :
 $param1 = $row["param1"] != null ? $row["param1"] : "NULL"; 
La valeur "NULL" est arbitrairement attribuée au champ "param1" si ce dernier est nul.
--------//////----//---//----//////
-------//---//----//---//----//---//
------//////----//////-----//////
-----||--------||--||---||
Prendre le recul n'est pas une perte de temps.


ps: Affrontez moi dans l'arène