par
Calimero » 16 mars 2012, 04:14
Amateurs de casse-tête, bonjour
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é

(à défaut de me servir dans l'immédiat, ça pourra toujours être utile à d'autres qui tomberaient plus tard sur le sujet).
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 ?

Eh bien, à vous de juger.
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.
Amateurs de casse-tête, bonjour :D
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é :) (à défaut de me servir dans l'immédiat, ça pourra toujours être utile à d'autres qui tomberaient plus tard sur le sujet).
On utilise MySQL 5, et voici une table de test et son jeu de données :
[html]+-------+--------------+------+-----+---------+----------------+
| 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 |
+----+-----------+------+-----+[/html]
On a donc un identifiant, des prénoms, des départements et des âges. Voici le code pour créer tout cela :
[sql]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);
[/sql]
On cherche à savoir, [b]pour l'ensemble des départements[/b], qui est la personne [b]la plus âgée[/b] de chaque département, avec [b]une requête SQL[/b].
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)) :
[html]+----+-----------+------+-----+
| id | name | dept | age |
+----+-----------+------+-----+
| 4 | Maxime | IT | 40 |
| 1 | Alexandre | DIR | 50 |
| 6 | Arnaud | SAL | 25 |
+----+-----------+------+-----+[/html]
Simple non ? :) Eh bien, à vous de juger.
[size=60][i]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 [u]performance[/u] et la [u]généricité[/u] de la requête à produire.[/i][/size]