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

Requêtes MySQL Discussion :

Tri par ordre alphabétique sans tenir compte d'une chaîne


Sujet :

Requêtes MySQL

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    216
    Détails du profil
    Informations personnelles :
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Juin 2006
    Messages : 216
    Points : 159
    Points
    159
    Par défaut Tri par ordre alphabétique sans tenir compte d'une chaîne
    Bonjour à tous

    Voilà mon problème :
    Je fais une requête du type :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    SELECT * FROM matable WHERE truc LIKE '%recherche%' ORDER BY nom
    C'est sur le ORDER BY que j'ai un problème. Il fonctionne à merveille, mais ma liste de noms se compose de diverses façons. Soit j'ai : "nom", soit j'ai "hotel nom" ou "hôtel nom", etc...
    Ce que je voudrais, c'est un tri qui ne tiennent pas compte du "hôtel", sachant qu'il n'y est pas toujours...

    Est-ce possible ?

  2. #2
    ced
    ced est déconnecté
    Rédacteur/Modérateur

    Avatar de ced
    Homme Profil pro
    Gestion de bases de données techniques
    Inscrit en
    Avril 2002
    Messages
    6 034
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Gestion de bases de données techniques
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Avril 2002
    Messages : 6 034
    Points : 23 779
    Points
    23 779
    Par défaut
    Bonjour,

    Une solution consisterait à essayer d'éliminer, pour le tri, les mots "hôtel". Pour cela, si il n'y a qu'un seul mot (à savoir "hotel") avant le nom de l'hôtel, il est possible de ne retenir que la sous-chaîne de caractère après le premier espace.

    Ca donnerait ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT *
    FROM matable
    ORDER BY CASE WHEN INSTR(nom, ' ') > 0 THEN SUBSTRING(nom, INSTR(nom, ' ') + 1) ELSE nom END
    Par contre, pour des noms du genre "Hôtel de la Poste", ça va classer "de la Poste" et non pas "la Poste"... Est-ce que ça ira ?

    ced

  3. #3
    Membre expérimenté

    Profil pro
    Inscrit en
    Août 2002
    Messages
    1 060
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2002
    Messages : 1 060
    Points : 1 357
    Points
    1 357
    Par défaut
    Bonjour,

    Si l'on est obligé d'utiliser ce genre de "bidouille", je pense que la structure des données n'est pas bonne.
    En reprenant l'exemple "hotel de la poste", j'utiliserais une structure de ce genre:
    categorie => hotel
    prefixe => de la
    nom => poste

  4. #4
    Membre habitué
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    216
    Détails du profil
    Informations personnelles :
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Juin 2006
    Messages : 216
    Points : 159
    Points
    159
    Par défaut
    Jeca : je suis entièrement d'accord, mais je ne suis hélas pas responsable des noms donnés... J'ai bien essayé de dire de virer Hôtel (ou bien de faire en sorte de le mettre partout), mais les données proviennent d'un fichier Excel et il faut que le terme "Hôtel" reste parfois présent, et parfois non...

    Ced : Merci ! Ca ne pose de problème pour l'exemple de "de la poste".
    Cependant, quelle est la requête exacte ? Car je ne vois le "hotel" à sortir là...
    Sachant qu'en plus, ironie du sort, et là aussi je ne peux pas modifier, dans la BDD le champ du nom de l'hôtel s'appelle pas "nom" mais hotel... Donc pour ma requête, je dois faire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    SELECT * FROM table
    ORDER BY CASE WHEN INSTR(hotel, 'hôtel') > 0 THEN SUBSTRING(hotel, INSTR(hotel, 'hôtel') + 1) ELSE hotel END
    Cette requête est-elle correcte pour ce que je veux ?
    Car je ne comprends pas tellement la syntaxe pour être honnête...
    Je vois bien à quoi correspond INSTR et SUBSTRING (j'ai vérifié sur la doc... et puis les noms parlent d'eux-mêmes ), mais pourquoi faire +1 ?

    J'aurais plutôt tendance à écrire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    SELECT * FROM table
    ORDER BY CASE WHEN INSTR(hotel, 'hôtel') > 0 THEN SUBSTRING(hotel, 'hôtel ') ELSE hotel END
    Merci d'avance !
    Et au passage, simple question, ça bouffe pas trop de ressource ? Il y a peu d'entrées dans la BDD (environ 500 à 700 hôtels enregistrés à priori), mais bon...

Discussions similaires

  1. [MySQL] Afficher une liste par ordre alphabétique sans prendre en compte les articles
    Par StephBretagne dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 12/04/2012, 15h57
  2. Tri par ordre alphabétique d'un tabular
    Par max0u86 dans le forum Tableaux - Graphiques - Images - Flottants
    Réponses: 3
    Dernier message: 21/08/2008, 22h31
  3. problème tri par ordre alphabétique
    Par bibi 8002 dans le forum Word
    Réponses: 17
    Dernier message: 18/06/2008, 15h21
  4. Réponses: 8
    Dernier message: 26/07/2007, 11h46
  5. Tri par ordre alphabétique
    Par orus8 dans le forum Langage SQL
    Réponses: 6
    Dernier message: 17/04/2003, 19h27

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