Voici une colle qu'on m'a posé récemment. Le sujet, en apparence simple, m'a intéressé (mes recherches ne m'ont pas permis de trancher définitivement, en tout cas pas avec le résultat que j'imaginais), alors je soumets la question à votre sagacité
On utilise MySQL 5, et voici une table de test et son jeu de données :
+-------+--------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------+--------------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| name | varchar(255) | NO | | NULL | |
| dept | varchar(255) | NO | | NULL | |
| age | int(11) | NO | | NULL | |
+-------+--------------+------+-----+---------+----------------+
+----+-----------+------+-----+
| id | name | dept | age |
+----+-----------+------+-----+
| 1 | Alexandre | DIR | 50 |
| 2 | David | IT | 30 |
| 3 | Pierre | IT | 24 |
| 4 | Maxime | IT | 40 |
| 5 | Julie | DIR | 29 |
| 6 | Arnaud | SAL | 25 |
+----+-----------+------+-----+
On a donc un identifiant, des prénoms, des départements et des âges. Voici le code pour créer tout cela :CREATE TABLE IF NOT EXISTS `latable` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(255) NOT NULL,
`dept` varchar(255) NOT NULL,
`age` int(11) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=7 ;
INSERT INTO `latable` (`id`, `name`, `dept`, `age`) VALUES
(1, 'Alexandre', 'DIR', 50),
(2, 'David', 'IT', 30),
(3, 'Pierre', 'IT', 24),
(4, 'Maxime', 'IT', 40),
(5, 'Julie', 'DIR', 29),
(6, 'Arnaud', 'SAL', 25);
On cherche à savoir, pour l'ensemble des départements, qui est la personne la plus âgée de chaque département, avec une requête SQL. Il y a dans ces données trois départements différents, donc la requête doit ramener trois résultats (un pour chaque, le ou la plus âgé(e)) :
+----+-----------+------+-----+
| id | name | dept | age |
+----+-----------+------+-----+
| 4 | Maxime | IT | 40 |
| 1 | Alexandre | DIR | 50 |
| 6 | Arnaud | SAL | 25 |
+----+-----------+------+-----+
Simple non ? l'intérêt du problème est à la fois de faire une liste des solutions possibles, mais aussi de critiquer ces solutions pour choisir "LA solution parfaite", si elle existe, ou sinon de passer en revue les inconvénients de chacune. On s'intéresse principalement à la performance et la généricité de la requête à produire.