Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#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 smile

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.

Hors 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 smile

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 wink
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() :

https://dev.mysql.com/doc/refman/8.0/en/group-by-functions.html a écrit :

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.... hmm

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 smile

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