Problème avec LEFT JOIN MYSQL [Résolu]

Messages postés
9
Date d'inscription
samedi 10 mai 2008
Dernière intervention
4 août 2011
- - Dernière réponse : kirk57
Messages postés
9
Date d'inscription
samedi 10 mai 2008
Dernière intervention
4 août 2011
- 19 janv. 2010 à 11:20
Bonjour,
J'ai 2 tables pour gérer le multilangue de l'interface et des pages "statiques" sur mes sites.
La première gère les clefs, la deuxième gère les contenus dans toutes les langues.
Voici le SQL pour créer les tables avec un peu de contenu pour que vous puissiez tester.

--
-- Structure de la table `dico`
--

CREATE TABLE IF NOT EXISTS `dico` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `key` varchar(50) COLLATE utf8_bin NOT NULL,
  `static` tinyint(1) NOT NULL DEFAULT '0',
  `active` tinyint(1) NOT NULL DEFAULT '1',
  `date_created` datetime DEFAULT NULL,
  `date_updated` datetime DEFAULT NULL,
  `deleted` tinyint(1) NOT NULL DEFAULT '0',
  `date_deleted` datetime DEFAULT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `var` (`key`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 COLLATE=utf8_bin AUTO_INCREMENT=7 ;

--
-- Contenu de la table `dico`
--

INSERT INTO `dico` (`id`, `key`, `static`, `active`, `date_created`, `date_updated`, `deleted`, `date_deleted`) VALUES
(1, 'historique', 0, 1, '2010-01-15 20:46:59', NULL, 0, NULL),
(2, 'la_societe', 0, 1, '2010-01-15 20:46:59', NULL, 0, NULL),
(3, 'presentation', 0, 1, '2010-01-15 20:46:59', NULL, 0, NULL),
(4, 'technologies', 0, 1, '2010-01-15 20:46:59', NULL, 0, NULL),
(5, 'localisation', 0, 1, '2010-01-15 20:46:59', NULL, 0, NULL);
(6, 'emploi', 0, 1, '2010-01-15 20:46:59', NULL, 0, NULL);

--
-- Structure de la table `translation`
--

CREATE TABLE IF NOT EXISTS `translation` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `id_dico` int(11) NOT NULL,
  `lang` varchar(2) COLLATE utf8_bin NOT NULL,
  `val` text COLLATE utf8_bin NOT NULL,
  `active` tinyint(1) NOT NULL DEFAULT '1',
  `date_created` datetime DEFAULT NULL,
  `date_updated` datetime DEFAULT NULL,
  `deleted` tinyint(1) NOT NULL DEFAULT '0',
  `date_deleted` datetime DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 COLLATE=utf8_bin AUTO_INCREMENT=11 ;

--
-- Contenu de la table `translation`
--

INSERT INTO `translation` (`id`, `id_dico`, `lang`, `val`, `active`, `date_created`, `date_updated`, `deleted`, `date_deleted`) VALUES
(1, 1, 'FR', 'Historique', 1, '2010-01-15 22:04:57', NULL, 0, NULL),
(2, 2, 'FR', 'La société', 1, '2010-01-15 22:04:57', NULL, 0, NULL),
(3, 3, 'FR', 'Présentation', 1, '2010-01-15 22:04:57', NULL, 0, NULL),
(4, 4, 'FR', 'Technologies', 1, '2010-01-15 22:04:57', NULL, 0, NULL),
(5, 5, 'FR', 'Localisation', 1, '2010-01-15 22:04:57', NULL, 0, NULL);
(6, 1, 'EN', 'History', 1, '2010-01-15 22:04:57', NULL, 0, NULL),
(7, 2, 'EN', 'The company', 1, '2010-01-15 22:04:57', NULL, 0, NULL),
(8, 3, 'EN', 'Introduction', 1, '2010-01-15 22:04:57', NULL, 0, NULL),
(9, 4, 'EN', 'Technology', 1, '2010-01-15 22:04:57', NULL, 0, NULL),
(10, 5, 'EN', 'Location', 1, '2010-01-15 23:08:51', NULL, 0, NULL);


Je souhaite pouvoir modifier ces valeurs via le backoffice et pour ce faire je veux récupérer toutes les clefs et leur contenu même si elles n'en ont pas encore.
Un exemple très simplifié de ce que je voudrais afficher :

'Key' 'Value'
'historique' 'History'
'la_societe' 'The company'
'presentation' 'Introduction'
'technologies' 'Technology'
'localisation' 'Location'
'emploi'

Comme vous pouvez le voir, la clef 'emploi' n'a pas de correspondance mais je voudrais que la clef s'affiche quand même que je puisse lui ajouter une valeur.
Voici la requête que je fait actuellement pour récupérer les clefs et leur valeur pour les textes de l'interface :

SELECT d.key, d.active, t.id, t.id_dico, t.val, t.active
FROM dico AS d LEFT JOIN translation AS t
ON d.id = t.id_dico
WHERE d.deleted = 0 
AND t.deleted = 0
AND d.static = 0
AND t.lang = 'EN'
ORDER BY d.key


Le problème est que je récupère seulement les clefs qui ont un enregistrement correspondant dans la table des valeurs.
Quelqu'un peut m'aider?
Merci d'avance.
Afficher la suite 

Votre réponse

3 réponses

Meilleure réponse
Messages postés
567
Date d'inscription
mercredi 4 octobre 2006
Dernière intervention
30 août 2011
3
Merci
Hello, essai le "LEFT OUTER JOIN" ?

Pour plus d'infos sur les jointures Ici...


_________________________________
Min iPomme

Merci Tonio_35 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources a aidé 103 internautes ce mois-ci

Commenter la réponse de Tonio_35
Messages postés
197
Date d'inscription
mardi 20 janvier 2004
Dernière intervention
20 février 2013
3
Merci
Bonjour,

peut être ceci: (si emploi n'a pas de correspondance dans la table traduction, les conditions where utilisant t l'exclus dans le résultat, d'où l'ajout du or)

SELECT d.key, d.active, t.id, t.id_dico, t.val, t.active
FROM dico AS d
LEFT JOIN translation AS t ON d.id = t.id_dico
WHERE d.deleted =0
AND (t.deleted =0 OR t.deleted IS NULL)
AND d.static =0
AND (t.lang = 'EN' OR t.lang IS NULL)
ORDER BY d.key


retourne
key active id id_dico val active
emploi 1 NULL NULL [BLOB - 0o] NULL
historique 1 6 1 [BLOB - 7o] 1
la_societe 1 7 2 [BLOB - 11o] 1
localisation 1 10 5 [BLOB - 8o] 1
presentation 1 8 3 [BLOB - 12o] 1
technologies 1 9 4 [BLOB - 10o] 1
bonne journée

Merci cs_47 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources a aidé 103 internautes ce mois-ci

Commenter la réponse de cs_47
Messages postés
9
Date d'inscription
samedi 10 mai 2008
Dernière intervention
4 août 2011
0
Merci
Merci pour le lien, grâce à cela j'ai pu résoudre mon problème comme suit :

SELECT d.key, d.active, t.id, t.id_dico, t.val, t.active
FROM dico AS d
LEFT OUTER JOIN translation AS t ON d.id = t.id_dico
WHERE (
d.deleted =0
AND t.deleted =0
AND d.static =0
AND t.lang =  'EN'
)
OR t.id IS NULL 
ORDER BY d.key


L'important c'est de préciser que l'on veut également les enregistrements NULL.

Merci beaucoup pour ton aide.
Commenter la réponse de kirk57

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.