Problème avec LEFT JOIN MYSQL

Résolu
Signaler
Messages postés
9
Date d'inscription
samedi 10 mai 2008
Statut
Membre
Dernière intervention
4 août 2011
-
Messages postés
9
Date d'inscription
samedi 10 mai 2008
Statut
Membre
Dernière intervention
4 août 2011
-
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.

3 réponses

Messages postés
567
Date d'inscription
mercredi 4 octobre 2006
Statut
Membre
Dernière intervention
30 août 2011
10
Hello, essai le "LEFT OUTER JOIN" ?

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


_________________________________
Min iPomme
Messages postés
197
Date d'inscription
mardi 20 janvier 2004
Statut
Membre
Dernière intervention
20 février 2013
1
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
Messages postés
9
Date d'inscription
samedi 10 mai 2008
Statut
Membre
Dernière intervention
4 août 2011

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.