http://dev.mysql.com/doc/refman/5.0/fr/left-join-optimization.html|7.2.9. Comment MySQL optimise les clauses LEFT JOIN et RIGHT JOIN
http://www.trucsweb.com/asp/trucs.asp?no=104&type=7|Jointures et relations INNER, LEFT, RIGHT, UNION…
Créer deux tables:
CREATE TABLE IF NOT EXISTS `a` (
`id` varchar(3) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
--
-- Contenu de la table `a`
--
INSERT INTO `a` (`id`) VALUES
('a'),
('b'),
('c'),
('d');
CREATE TABLE IF NOT EXISTS `b` (
`a_id` varchar(3) NOT NULL,
`b` tinyint(4) NOT NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
--
-- Contenu de la table `b`
--
INSERT INTO `b` (`a_id`, `b`) VALUES
('a', 1),
('a', 2),
('b', 1),
('b', 3);
Si on fait:
SELECT * FROM `a` , `b` WHERE a.id = b.a_id LIMIT 0 , 30
mysql retourne
a a 1 a a 2 b b 1 b b 3
on n'a donc pas les enregistrements c
pour les avoir:
SELECT * FROM a LEFT JOIN b ON a.id = b.a_id
renvoie
a a 1 a a 2 b b 1 b b 3 c NULL NULL d NULL NULL
Pour nettoyer
SELECT b.a_id, b.b FROM a LEFT JOIN b ON a.id = b.a_id LIMIT 0 , 30
renvoie
a 1 a 2 b 1 b 3 NULL NULL NULL NULL
SELECT * FROM b LEFT JOIN a ON a.id = b.a_id
ne retourne que
a a 1 a a 2 b b 1 b b 3