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

kirk57 9 Messages postés samedi 10 mai 2008Date d'inscription 4 août 2011 Dernière intervention - 19 janv. 2010 à 10:40 - Dernière réponse : kirk57 9 Messages postés samedi 10 mai 2008Date d'inscription 4 août 2011 Dernière intervention
- 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
Tonio_35 567 Messages postés mercredi 4 octobre 2006Date d'inscription 30 août 2011 Dernière intervention - 19 janv. 2010 à 10:54
3
Merci
Hello, essai le "LEFT OUTER JOIN" ?

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


_________________________________
Min iPomme

Merci Tonio_35 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 96 internautes ce mois-ci

Commenter la réponse de Tonio_35
Meilleure réponse
cs_47 197 Messages postés mardi 20 janvier 2004Date d'inscription 20 février 2013 Dernière intervention - 19 janv. 2010 à 11:08
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

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 96 internautes ce mois-ci

Commenter la réponse de cs_47
kirk57 9 Messages postés samedi 10 mai 2008Date d'inscription 4 août 2011 Dernière intervention - 19 janv. 2010 à 11:20
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.