Pages : 1
#1 Le 06/05/2020, à 12:06
- DonutMan75
[RESOLU] Question pipeau MySQL
Hello,
je suis en train de suivre le cours MySQL d'OpenClassRoom et je me suis posé une question... à laquelle je n'arrive pas à trouver de réponse...
La fonction MIN() permet de récupérer la valeur minimale d'une colonne... mais comment afficher les autres colonnes de la ligne ainsi retenue ?
Je vois deux solutions "bidouille" mais sans savoir si elles sont propres ou pas... Qu'en pensez-vous ?
Par exemple, dans une table contenant des noms et des dates de naissance, on veut afficher l'individu le plus jeune :
SELECT nom, date_naissance FROM Personne ORDER BY date_naissance ASC LIMIT 1;
Plus compliqué, il y a aussi ça :
SELECT nom, date_naissance FROM Personne WHERE date_naissance=( SELECT MIN(date_naissance) FROM Personne);
Merci d'avance
Donut
Dernière modification par DonutMan75 (Le 07/05/2020, à 16:44)
Hors ligne
#2 Le 06/05/2020, à 12:33
- Watael
Re : [RESOLU] Question pipeau MySQL
salut,
je suis en train de suivre le cours MySQL d'OpenClassRoom et je me suis posé une question
et pourquoi ne la poses-tu pas à ceux qui hébergent le cours (openClassRooms ! ) ?
Connected \o/
Welcome to sHell. · eval is evil.
En ligne
#3 Le 07/05/2020, à 10:32
- DonutMan75
Re : [RESOLU] Question pipeau MySQL
j'ai aussi posté sur le forum d'OpenClassRoom dédié à SQL.. mais pour une question aussi générique, je me suis dit que je pouvais aussi solliciter l'aide de la communauté Ubuntu
Hors ligne
#4 Le 07/05/2020, à 11:47
- bruno
Re : [RESOLU] Question pipeau MySQL
Si tu ne sais pas à ce stade du cours, il faut reprendre depuis le début. Ou alors le cours est très mal foutu
Les « cours » c'est bien, la doc c'est mieux.
Indice : tes propositions sont tordues, c'est beaucoup plus simple que cela.
Dernière modification par bruno (Le 07/05/2020, à 13:49)
#5 Le 07/05/2020, à 14:19
- DonutMan75
Re : [RESOLU] Question pipeau MySQL
Hello,
oui j'avais bien entendu regardé la doc. Je cite la définition de la fonction MIN() :
MIN([DISTINCT] expr) [over_clause]
Returns the minimum value of expr. MIN() may take a string argument; in such cases, it returns the minimum string value. See Section 8.3.1, “How MySQL Uses Indexes”. The DISTINCT keyword can be used to find the minimum of the distinct values of expr, however, this produces the same result as omitting DISTINCT.
If there are no matching rows, MIN() returns NULL.
This function executes as a window function if over_clause is present. over_clause is as described in Section 12.21.2, “Window Function Concepts and Syntax”; it cannot be used with DISTINCT.
mysql> SELECT student_name, MIN(test_score), MAX(test_score)
FROM student
GROUP BY student_name;For MIN(), MySQL currently compares ENUM and SET columns by their string value rather than by the string's relative position in the set. This differs from how ORDER BY compares them.
Le code donné en exemple donne le MIN et le MAX des notes de chaque élève (c'est le rôle du GROUP BY student_name), mais ce n'est pas ce que je recherche... Ce que je cherche c'est (par exemple) afficher le nom de l'élève ayant eu la pire note.
Je ne vois pas où la doc mentionne cela....
J'avais pensé farfouillé du côté de GROUP_CONCAT() mais ça reste une syntaxe compliquée.
Si c'est si simple que cela, une âme charitable pourrait-elle me débloquer ?
Merci par avance
D.
Hors ligne
#6 Le 07/05/2020, à 15:15
- DonutMan75
Re : [RESOLU] Question pipeau MySQL
Mince d'ailleurs je me rends compte que je souhaitais poster cela dans la rubrique "développement" mais ça a atteri dans la rubrique "café"...
Je reposte proprement dans la rubrique adaptée.
Dernière modification par DonutMan75 (Le 07/05/2020, à 15:19)
Hors ligne
#7 Le 07/05/2020, à 15:19
- DonutMan75
Re : [RESOLU] Question pipeau MySQL
Bonjour à tous,
la fonction MIN() permet de récupérer la valeur minimale d'une colonne... mais comment afficher les autres colonnes de la (ou les) lignes ainsi retenue ?
Je vois deux solutions "bidouille" mais sans savoir si elles sont propres ou pas... Qu'en pensez-vous ?
Par exemple, dans une table contenant des noms et des dates de naissance, on veut afficher l'individu le plus jeune :
SELECT nom, date_naissance FROM Personne ORDER BY date_naissance ASC LIMIT 1;
SELECT nom, date_naissance FROM Personne WHERE date_naissance=( SELECT MIN(date_naissance) FROM Personne);
Ces deux lignes fonctionnent bien et sont équivalentes... sauf dans le cas où le minium est rencontré pour plusieurs lignes. La solution #1 renverra un individu arbitraire parmi les plus jeunes alors que la solution #2 renverra l'ensemble des individus les plus jeunes.
Voyez-vous plus simple ? Plus rapide ? Plus élégant ?
Merci d'avance pour votre aide
Donut
Hors ligne
#8 Le 07/05/2020, à 15:23
- DonutMan75
Re : [RESOLU] Question pipeau MySQL
Je peux aussi tenter un :
SELECT GROUP_CONCAT(nom) FROM Personne GROUP BY date_naissance ORDER BY date_naissance LIMIT 1;
Hors ligne
#9 Le 07/05/2020, à 15:33
- bruno
Re : [RESOLU] Question pipeau MySQL
Modération : discussions fusionnées. Je rappelle que les doublons sont interdits par les règles du forum.
--
Solution que tu aurais pu trouver toi-même puisque pratiquement identique à l'exemple de la doc MySQL :
select nom, MIN(date_naissance) from Personne;
#10 Le 07/05/2020, à 15:44
- DonutMan75
Re : [RESOLU] Question pipeau MySQL
Bonjour,
J'avais pensé à un truc dans ce goût là, mais cette solution ne fonctionne pas.
CREATE TABLE tdate ( nom VARCHAR(20), naissance SMALLINT);
INSERT INTO tdate (nom, naissance) VALUES ('Pierre', 5), ('Paul', 3), ('Jack', 8);
SELECT * FROM tdate;
+--------+-----------+
| nom | naissance |
+--------+-----------+
| Pierre | 5 |
| Paul | 3 |
| Jack | 8 |
+--------+-----------+
On est bien d'accord que le plus jeune ici c'est Paul. Or :
SELECT nom, MIN(naissance) FROM tdate;
+--------+----------------+
| nom | MIN(naissance) |
+--------+----------------+
| Pierre | 3 |
+--------+----------------+
Hors ligne
#11 Le 07/05/2020, à 15:53
- bruno
Re : [RESOLU] Question pipeau MySQL
Au temps pour moi, il faut deux requêtes (ou plutôt une sous-requête) :
SELECT * FROM tdate WHERE naissance IN ( SELECT MIN(naissance) FROM tdate );
Dernière modification par bruno (Le 07/05/2020, à 15:55)
#12 Le 07/05/2020, à 16:44
- DonutMan75
Re : [RESOLU] Question pipeau MySQL
Hello,
super merci pour ton retour,
on reste dans la philosophie de ma solution #2 donc (j'avais peur de passer à côté d'une subtilité de MySql ^^)
Je peux passer en résolu.
Merci et à bientôt !
D.
Hors ligne
Pages : 1