Bonjour à tous,

je fais quelques développement sur un site php où il y a un principe de multilanguisme. Je souhaite faire une requête qui pointe sur une table et qui pointe sur une autre table si il n'y a pas de résultat.

Voici un exemple, j'ai 3 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
-----------------------
|        ITEM         |
-----------------------
| id | id_description |
-----------------------
| 1  |      1         |
| 2  |      2         |
-----------------------
 
-----------------------------------------
| DESCRIPTION_FR_FR                     |
-----------------------------------------
| id | description                      |
-----------------------------------------
| 1  | voici la description de l'item 1 |
| 2  | voici la description de l'item 2 |
-----------------------------------------
 
-----------------------------------------
| DESCRIPTION_EN_EN                     |
-----------------------------------------
| id | description                      |
-----------------------------------------
| 1  | this is the item 1 description   |
-----------------------------------------
DESCRIPTION_FR_FR est la table langue par défaut, cad que l'id référencé dans le champ id_description de la table ITEM existe forcément.
DESCRIPTION_EN_EN est une table langue cad qu'il y a l'équivalent de la DESCRIPTION_FR_FR traduit en anglais, sauf que certaines valeurs peuvent ne pas être dedans (comme dans l'exemple).


Mon but est d'afficher chaque item en anglais, mais s'il n'existe pas de traduction anglaise alors il faut afficher la traduction française (qui existe forcément). Et dans chaque résultat afficher son origine. Soit obtenir avec l'exemple précédent le résultat suivant :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
--------------------------------------------------------
| id_item | description                      | origine |
--------------------------------------------------------
| 1       | this is the item 1 description   | en_en   |
| 2       | voici la description de l'item 2 | fr_fr   |
--------------------------------------------------------

Il existe déjà un système pour faire cela en effectuant plusieurs requêtes (cad faire une boucle sur chaque item, puis pour chaque element faire une requete sur la table en_en et si il n'y a pas de résultat faire une requete sur la table fr_fr).
Mais on m'a dit que c'était possible de faire cela en une seule requête. Est-ce exact ?




Merci de votre aide

PoichOU

ps : voici le dump de la base si ça peut être utile
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
CREATE TABLE `item` (
  `id` int(11) NOT NULL auto_increment,
  `id_description` int(11) NOT NULL,
  PRIMARY KEY  (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;
 
 
 
CREATE TABLE `description_fr_fr` (
  `id` int(11) NOT NULL auto_increment,
  `description` longtext NOT NULL,
  PRIMARY KEY  (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;
 
 
CREATE TABLE `description_en_en` (
  `id` int(11) NOT NULL auto_increment,
  `description` longtext NOT NULL,
  PRIMARY KEY  (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;
 
 
INSERT INTO `description_fr_fr` ( `id` , `description` ) 
VALUES
(1 , 'voici la description de l''item 1'),
(2 , 'voici la description de l''item 2');
 
INSERT INTO `description_en_en` ( `id` , `description` ) 
VALUES
(1 , 'this is the item 1 description');
 
 
INSERT INTO `item`  ( `id` , `id_description` ) 
VALUES 
(1 , 1), 
(2 , 2);