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 :

[FAQ] Trier par ordre... non-alphabétique


Sujet :

Langage SQL

  1. #1
    kaceo
    Invité(e)
    Par défaut [FAQ] Trier par ordre... non-alphabétique
    Bonjour à tous !

    Voilà mon petit problème. J'ai quelquechose du type

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT *
    FROM librairie
    ORDER BY cp
    cp étant des codes postaux

    Mais je voudrais trier ça en mettant d'abord les codes postaux qui commencent par 60 (where cp like '60%'), puis par 02, puis par 80, puis tout le reste...

    J'aimerais savoir si c'est possible en SQL ou si je le développe en php.
    Merci !

  2. #2
    Xo
    Xo est déconnecté
    Expert confirmé
    Avatar de Xo
    Inscrit en
    Janvier 2005
    Messages
    2 701
    Détails du profil
    Informations personnelles :
    Âge : 51

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 701
    Points : 4 238
    Points
    4 238
    Par défaut
    Décompose ta requête en plusieurs sous-requêtes selon le critère souhaité, regroupe-les via des UNION, et ajoute une pseudo-colonne de tri :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    SELECT 1 AS CodeTri, CP, ...
      FROM Librairie 
     WHERE CP LIKE '60%'
    UNION ALL
    SELECT 2 AS CodeTri, CP, ...
      FROM Librairie 
     WHERE CP LIKE '02%'
    UNION ALL
    SELECT 3 AS CodeTri, CP, ...
      FROM Librairie 
     WHERE CP NOT LIKE '02%'
       AND CP NOT LIKE '60%'
    ORDER BY CodeTri ASC, CP

  3. #3
    Membre régulier
    Inscrit en
    Mars 2005
    Messages
    196
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 196
    Points : 99
    Points
    99
    Par défaut
    ça tombe bien j'aivais le même problème!

    je teste ça tout de suite.

    Merci!


    Edit : à quoi correspond :
    SELECT 1 AS ...
    SELECT 2 AS ...
    ?

  4. #4
    Xo
    Xo est déconnecté
    Expert confirmé
    Avatar de Xo
    Inscrit en
    Janvier 2005
    Messages
    2 701
    Détails du profil
    Informations personnelles :
    Âge : 51

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 701
    Points : 4 238
    Points
    4 238
    Par défaut
    CodeTri est un "pseudo" champ, qui prend la valeur 1 quand le CP commence par '60', 2 quand il commence par '02', ou 3 sinon : ça permet donc de personnaliser le tri. Le mot-clé AS sert à baptiser le champ

  5. #5
    Membre régulier
    Inscrit en
    Mars 2005
    Messages
    196
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 196
    Points : 99
    Points
    99
    Par défaut
    Pour bien comprendre ce qui est fait j'ai personaliser comme ci-dessous pour adapter à mon problème :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    "SELECT 1 AS CodeTri,* FROM evenements WHERE 'import' LIKE 'Tr%'
        UNION ALL
        SELECT 2 AS CodeTri,* FROM evenements WHERE 'import' LIKE 'El%'
        UNION ALL
        SELECT 3 AS CodeTri,* FROM evenements WHERE 'import' LIKE 'No%'
        UNION ALL
        SELECT 4 AS CodeTri,* FROM evenements WHERE 'import' LIKE 'Fa%'
        UNION ALL
        ORDER BY CodeTri DESC"

  6. #6
    Membre régulier
    Inscrit en
    Mars 2005
    Messages
    196
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 196
    Points : 99
    Points
    99
    Par défaut
    Ce que je veux faire c'est tout sélectionner et trier suivant 'import'.
    Mais j'ai dut Zapper quelque chose!?

  7. #7
    kaceo
    Invité(e)
    Par défaut
    Merci Xo ! Mais si j'ai compris sur le principe... en pratique je pense être comme rteuteu55 un peu paumé...

    avec :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
     
    SELECT 1 AS CodeTri,*
      FROM librairie
      WHERE cp LIKE '60%'
     UNION ALL
     
    SELECT 2 AS CodeTri,*
      FROM librairie
      WHERE cp LIKE '02%'
     UNION ALL
     
    SELECT 3 AS CodeTri,*
      FROM librairie
      WHERE cp LIKE '80%'
     UNION ALL
     
    SELECT 4 AS CodeTri,* 
      FROM librairie
      WHERE cp NOT LIKE '60%'
      AND cp NOT LIKE '02%'
      AND cp NOT LIKE '80%'
     
    ORDER BY CodeTri ASC, cp

  8. #8
    Xo
    Xo est déconnecté
    Expert confirmé
    Avatar de Xo
    Inscrit en
    Janvier 2005
    Messages
    2 701
    Détails du profil
    Informations personnelles :
    Âge : 51

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 701
    Points : 4 238
    Points
    4 238
    Par défaut
    Citation Envoyé par rteuteu55
    Ce que je veux faire c'est tout sélectionner et trier suivant 'import'.
    Mais j'ai dut Zapper quelque chose!?
    Si Import est un nom de champ, il ne doit pas être encadré par des quotes dans ta requête !

    Citation Envoyé par kaceo
    Mais si j'ai compris sur le principe... en pratique je pense être comme rteuteu55 un peu paumé...
    Paumé où ça ? Ca ne fonctionne pas ? Ca ne renvoie pas ce que tu veux ?

    Pour bien comprendre, il suffit d'éxecuter les SELECT indépendamment les uns des autres, et de regarder la liste des résultats. La requête avec les UNION renverra toutes les lignes de ces SELECT, en les triant selon votre clause ORDER BY

  9. #9
    Membre régulier
    Inscrit en
    Mars 2005
    Messages
    196
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 196
    Points : 99
    Points
    99
    Par défaut
    Citation Envoyé par Xo
    ...
    Pour bien comprendre, il suffit d'éxecuter les SELECT indépendamment les uns des autres, et de regarder la liste des résultats. La requête avec les UNION renverra toutes les lignes de ces SELECT, en les triant selon votre clause ORDER BY
    C'est ce que je fait actuellement mais ça me sort ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    SELECT 1 AS CodeTri, * 
    FROM evenements
    WHERE import
    LIKE 'Tr%'
    LIMIT 0 , 30 
     
    MySQL a répondu:
     
     
    #1064 - You have an error in your SQL syntax.  Check the manual that corresponds to your MySQL server version for the right syntax to use near '* 
    FROM evenements
    WHERE import
    LIKE  'Tr%' LIMIT 0, 30' at lin


    edit : si je vire '*' et que je remplace par l'énumération de tout les champs ça marche?! :

  10. #10
    Xo
    Xo est déconnecté
    Expert confirmé
    Avatar de Xo
    Inscrit en
    Janvier 2005
    Messages
    2 701
    Détails du profil
    Informations personnelles :
    Âge : 51

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 701
    Points : 4 238
    Points
    4 238
    Par défaut
    Ne met pas * mais un nom de champ valide, et regarde ce que ça donne ?

    Perso, je précise toujours les noms de champs utilisés, je ne me sers pas de '*' ...

  11. #11
    Membre régulier
    Inscrit en
    Mars 2005
    Messages
    196
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 196
    Points : 99
    Points
    99
    Par défaut
    Non de Non!

    Ca marche

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    SELECT 1  AS CodeTri, import, id
    FROM evenements
    WHERE import
    LIKE  'Tr%'
    UNION ALL
     
    SELECT 2  AS CodeTri, import, id
    FROM evenements
    WHERE import
    LIKE  'El%'
    UNION ALL
     
    SELECT 3  AS CodeTri, import, id
    FROM evenements
    WHERE import
    LIKE  'No%'
    UNION ALL
     
    SELECT 4  AS CodeTri, import, id
    FROM evenements
    WHERE import
    LIKE  'Fa%'
     
    ORDER BY CodeTri DESC
    Merci à toi

  12. #12
    kaceo
    Invité(e)
    Par défaut
    les SELECT marchent sans probleme de manière indépendante mais dès l'ajout d'un deuxième avec UNION ALL entre les deux, ça ne fonctionne plus...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    SELECT 1 AS CodeTri, nom, adresse, cp, ville, site
    FROM librairie
    WHERE cp LIKE '60%'
    UNION ALL
     
    SELECT 2 AS CodeTri, nom, adresse, cp, ville, site 
    FROM librairie 
    WHERE cp LIKE '02%'
    UNION ALL
     
    SELECT 3 AS CodeTri, nom, adresse, cp, ville, site 
    FROM librairie 
    WHERE cp LIKE '80%'
    UNION ALL
     
    SELECT 4 AS CodeTri, nom, adresse, cp, ville, site 
    FROM librairie 
    WHERE cp NOT LIKE '60%' 
    AND cp NOT LIKE '02%' 
    AND cp NOT LIKE '80%'
     
    ORDER BY CodeTri ASC, cp
    MySQL a répondu:

    #1064 - You have an error in your SQL syntax near 'UNION ALL
    SELECT 2 AS CodeTri, nom, adresse, cp, ville, site
    FROM librairie
    W' at line 5

  13. #13
    Xo
    Xo est déconnecté
    Expert confirmé
    Avatar de Xo
    Inscrit en
    Janvier 2005
    Messages
    2 701
    Détails du profil
    Informations personnelles :
    Âge : 51

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 701
    Points : 4 238
    Points
    4 238
    Par défaut
    Et avc UNION seul, sans le ALL ?

    Essaye aussi sans lignes à blanc, je ne sais pas si c'est bien pris en compte par tous les SGBD ?

  14. #14
    kaceo
    Invité(e)
    Par défaut
    UNION seul, je l'avais testé aussi sans succès,
    pareil pour les lignes à blanc

  15. #15
    Xo
    Xo est déconnecté
    Expert confirmé
    Avatar de Xo
    Inscrit en
    Janvier 2005
    Messages
    2 701
    Détails du profil
    Informations personnelles :
    Âge : 51

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 701
    Points : 4 238
    Points
    4 238
    Par défaut
    cf ce lien : http://mysql.developpez.com/faq/?pag...IBILITE_except

    Quel est ta version de MySQL ?
    (A toujours préciser dès le début )

  16. #16
    kaceo
    Invité(e)
    Par défaut
    oups! MySQL 3.23.56... je comprends mieux... désolé de t'avoir dérangé c'est réglé maintenant, merci pour le lien et pour ton aide !!!

Discussions similaires

  1. Réponses: 11
    Dernier message: 28/06/2010, 11h16
  2. [XL-2007] Trier par ordre alphabétique
    Par obyone118 dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 10/08/2009, 15h39
  3. Fonction pour trier par ordre alphabétique
    Par brunobzh dans le forum C++
    Réponses: 6
    Dernier message: 18/04/2008, 10h51
  4. Trier par ordre alphabétique un tableau
    Par barbiche dans le forum Collection et Stream
    Réponses: 7
    Dernier message: 09/03/2007, 17h15
  5. Réponses: 1
    Dernier message: 27/05/2006, 23h13

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