IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage SQL Discussion :

Initiation à SQL : COUNT et ORDER BY


Sujet :

Langage SQL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Candidat au Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Décembre 2022
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Décembre 2022
    Messages : 3
    Par défaut Initiation à SQL : COUNT et ORDER BY
    Bonsoir à tous,

    Je travaille sur MySQL Workbench et à partir d'une table recensant le nom de toutes le communes françaises, je dois effectuer la requête permettant d'obtenir la liste des villes qui ont un nom existants plusieurs fois, et de la trier afin d’obtenir en premier celles dont le nom est le plus souvent utilisé par plusieurs communes (exercice proposé sur SQL.sh).

    J'ai réussi à répondre ainsi :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT ville_nom, COUNT(ville_nom) as doublon_ville
    FROM `villes_france_free` 
    HAVING COUNT(ville_nom)>1
    ORDER BY doublon_ville desc;
    Tandis que la correction se présente comme cela :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT ville_nom, COUNT(*) AS nbt_item 
    FROM `villes_france_free` 
    GROUP BY `ville_nom` 
    ORDER BY nbt_item DESC;
    Je ne comprends pas pourquoi j'obtiens bien la liste des doublons alors que la condition occurrence>1 n'est pas spécifiée. J'ai bien repéré qu'en enlevant la ligne ORDER BY la requête me renvoie également la liste des villes ayant un nom unique, mais je ne saisis pas le lien entre COUNT et ORDER BY qui, apparemment, permet de supprimer par défaut les valeurs inférieures à 2.

    Quelqu'un pourrait-il m'expliquer ?

    Merci par avance !

  2. #2
    Modérateur
    Avatar de sevyc64
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2007
    Messages
    10 251
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 251
    Par défaut
    La condition est ORDER BY nbt_item DESC;. Tu ne supprime pas les valeurs inférieures à 2, mais tu tris du plus grand nombre au plus petit. donc les villes avec un compte à 1 se retrouvent tout à fait à la fin de ton résultat. Il n'y a aucune raisons qu'elles soient supprimées avec cette requête.

    Quant à ta réponse à toi, cette requête ne devrait pas marcher, il manque la clause GROUP BY.
    Je ne connais pas spécifiquement MySQL, peut-être est-il suffisamment permissif pour l'accepter quand même

  3. #3
    Candidat au Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Décembre 2022
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Décembre 2022
    Messages : 3
    Par défaut
    Citation Envoyé par sevyc64 Voir le message
    La condition est ORDER BY nbt_item DESC;. Tu ne supprime pas les valeurs inférieures à 2, mais tu tris du plus grand nombre au plus petit. donc les villes avec un compte à 1 se retrouvent tout à fait à la fin de ton résultat. Il n'y a aucune raisons qu'elles soient supprimées avec cette requête.

    Quant à ta réponse à toi, cette requête ne devrait pas marcher, il manque la clause GROUP BY.
    Je ne connais pas spécifiquement MySQL, peut-être est-il suffisamment permissif pour l'accepter quand même
    En effet, en changeant DESC par ASC je retrouve tous mes petits
    Je me disais bien qu'il y avait un problème dans ce corrigé !

    Merci de vos réponses

  4. #4
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 135
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 135
    Par défaut
    Citation Envoyé par Lycetilia Voir le message
    Je me disais bien qu'il y avait un problème dans ce corrigé !
    Par curiosité, où trouve-t-on ce tutoriel encourageant de mauvaises pratiques ?
    Modérateur Langage SQL
    Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
    N'oubliez pas le bouton et pensez aux balises
    [code]
    Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
    Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.

  5. #5
    Candidat au Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Décembre 2022
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Décembre 2022
    Messages : 3
    Par défaut
    Citation Envoyé par al1_24 Voir le message
    Par curiosité, où trouve-t-on ce tutoriel encourageant de mauvaises pratiques ?
    Par ici : https://sql.sh/exercices-sql
    A la décharge de l'auteur, le reste du site est bien pratique pour débuter !

  6. #6
    Modérateur
    Avatar de sevyc64
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2007
    Messages
    10 251
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 251
    Par défaut
    Enoncé de la requete 8 :
    Obtenir la liste des villes qui ont un nom existants plusieurs fois, et trier afin d’obtenir en premier celles dont le nom est le plus souvent utilisé par plusieurs communes
    Résultat proposé :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT ville_nom, COUNT(*) AS nbt_item 
    FROM `villes_france_free` 
    GROUP BY `ville_nom` 
    ORDER BY nbt_item DESC
    A la remarque près, faite par Sèb. sur le Order by sur un alias dans la solution proposée, l'énoncé de la requête est un peu ambiguë.

    Si on considère que l'exclusion des villes dont le nombre est à 1 n'est pas explicitement prononcé, et c'est le cas, la solution proposée est juste.
    Si on considère que le terme employé "existants plusieurs fois" est suffisant pour exclure, de fait, les villes dont le nombre est à 1, la solution proposée n'est pas juste, il manque la condition HAVING pour filtrer le résultat. Car sémantiquement plusieurs commence à 2, pas à 1.
    C'est un problème d'interprétation de la question qui prête à confusion.

  7. #7
    Expert confirmé
    Avatar de Séb.
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    5 325
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 325
    Billets dans le blog
    17
    Par défaut
    Enoncé :

    Obtenir la liste des villes qui ont un nom existants plusieurs fois, et trier afin d’obtenir en premier celles dont le nom est le plus souvent utilisé par plusieurs communes
    Les 2 réponses sont incorrectes.

    La 1re car il manque la clause GROUP BY.
    Passe MySQL en mode strict avec la commande SET @@sql_mode = 'ANSI,TRADITIONAL'; et la même requête sortira une erreur.
    C'est généralement une bonne idée de configurer le serveur MySQL en "ANSI,TRADITIONAL".

    Le 2nde car le ORDER BY sur un alias n'est pas standard, et elle ne respecte pas l'énoncé "liste des villes qui ont un nom existants plusieurs fois" puisqu'elle sort aussi les noms de ville ayant 1 seule occurrence.

    Dans les 2 cas il est ici inutile (et non standard) de délimiter le nom de la table avec les `.
    De plus en mode strict on peut utiliser le délimiteur standard " à la place.

    La bonne solution serait :

    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT ALL ville_nom
    FROM villes_france_free
    GROUP BY ville_nom
    HAVING COUNT(*) > 1
    ORDER BY COUNT(*) DESC

Discussions similaires

  1. [SQL] count & group avec order étrange ?
    Par rduvrac dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 28/04/2008, 02h30
  2. [Tableaux] affichage tableau php apres requete sql count
    Par heteroclite dans le forum Langage
    Réponses: 1
    Dernier message: 13/09/2006, 20h53
  3. [SQL] union et order by
    Par lazzeroni dans le forum Oracle
    Réponses: 2
    Dernier message: 11/07/2006, 16h08
  4. [Access] Requète SQL Group By, Order By and Co
    Par zoidy dans le forum Langage SQL
    Réponses: 4
    Dernier message: 09/06/2006, 14h37
  5. [SQL] count
    Par bugmenot dans le forum Access
    Réponses: 4
    Dernier message: 08/04/2006, 11h12

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo