J’ai toujours eu quelques diffuculté a bien visualisé les différence qu’il y avait entre left join, right join, join, etc lorsque je fait des requêtes SQL. Aujourd’hui je suis tombé sur un exemple frappant, et je me suis dit que cela pouvait en aider plus d’un! Comme une image vaux mieux qu’un long discours, en voici l’essence.
L’exemple suivant se base sur une base de donnée mysql :
CREATE TABLE IF NOT EXISTS `acl_roles` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`name` varchar(30) CHARACTER SET utf8 NOT NULL,
`build_on` int(11) unsigned DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `build_on` (`build_on`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin;
INSERT INTO `acl_roles` (`id`, `name`, `build_on`) VALUES
(1, 'guest', NULL),
(2, 'normal', 1),
(3, 'modo', 2),
(4, 'admin', 3);
ALTER TABLE `acl_roles` ADD CONSTRAINT FOREIGN KEY (`build_on`) REFERENCES `acl_roles` (`id`) ON DELETE CASCADE ON UPDATE CASCADE;
Nous avons donc une table avec des clefs de référence pour marquer les dépendance entre les roles. En images cela donne ceci :
id | name | build_on |
---|---|---|
1 | guest | NULL |
2 | normal | 1 |
3 | modo | 2 |
4 | admin | 3 |
Maintenant regardons le résultats de divers SELECT, le résultat parle de lui-même.
SELECT ar.*, arp.name AS parent_name FROM acl_roles ar, acl_roles arp WHERE arp.id = ar.build_on
id | name | build_on | parent_name |
---|---|---|---|
2 | normal | 1 | guest |
3 | modo | 2 | normal |
4 | admin | 3 | modo |
SELECT ar.*, arp.name AS parent_name FROM acl_roles ar LEFT JOIN acl_roles arp ON arp.id = ar.build_on
id | name | build_on | parent_name |
---|---|---|---|
1 | guest | NULL | NULL |
2 | normal | 1 | guest |
3 | modo | 2 | normal |
4 | admin | 3 | modo |
SELECT ar.*, arp.name AS parent_name FROM acl_roles ar JOIN acl_roles arp ON arp.id = ar.build_on
id | name | build_on | parent_name |
---|---|---|---|
2 | normal | 1 | guest |
3 | modo | 2 | normal |
4 | admin | 3 | modo |
SELECT ar.*, arp.name AS parent_name FROM acl_roles ar RIGHT JOIN acl_roles arp ON arp.id = ar.build_on
id | name | build_on | parent_name |
---|---|---|---|
2 | normal | 1 | guest |
3 | modo | 2 | normal |
4 | admin | 3 | modo |
NULL | NULL | NULL | admin |
J’espère que l’exemple servira a certain et que cela en aidera plus d’un!