[SQL, PHP] ORDER BY, avec un ordre à moi :P !

Résolu
Utilisateur anonyme -  
 Utilisateur anonyme -
Bonjour tout le monde !

Comment faire un ordre personnalisé en SQL ?
En fait j'ai un champ de type SET, avec 3 valeurs "alphabétiques",
J'aimerai trouver une façon de dire à SQL :

En premier les résultats avec SET="Lima", puis avec SET="Alpha", puis avec SET="Wisky", puis enfin tout les autres.

J'ai bien sessayer avec GROUPED BY, mais cela les groupe seulement, pas organise selon mes critères (?), ou faire trois demande SQL distinctes, puis utiliser PHP, mais bon...

Donc savez-vous s'il existe une telle façon, en SQL ?
Merci d'avance !

4 réponses

  1. java4ever
     
    Si tu veux trier dans un ordre différent des valeurs du SET et que tu peux créer ne fonction, je te propose cette requête qui utilise une fonction personnalisée (ma table s'appelle 'lettre'):
    SELECT * FROM lettres  order by monordre(motcle)
    

    J'avais créé une colonne de type SET avec Lima,Alpha et Whisky et si je veux avoir l'ordre Whisky, Lima, Alpha et les autres (null ou vide) j'ai créé la fonction :
    CREATE FUNCTION monordre (valeur VARCHAR(10)) RETURNS INT
     DETERMINISTIC
    BEGIN
    	DECLARE return_value INT;
      IF (valeur = 'Whisky') THEN
        SET return_value = 0;
      ELSEIF (valeur = 'Lima') THEN
        SET return_value = 1;
      ELSEIF (valeur = 'Alpha') THEN
        SET return_value = 2;
      ELSE  SET return_value = 1000;
      END IF;
    	RETURN return_value;
    END
    

    Avec ça j'obtiens bien :
    "ID","motcle","libelle"
    1,"Whisky","W"
    3,"Alpha","A"
    2,"Lima","L"
    4,,"B"
    5,"","C"
    alors que si je fais
    SELECT * FROM lettres order by motcle

    J'obtiens :
    "ID","motcle","libelle"
    4,,"B"
    5,"","C"
    2,"Lima","L"
    3,"Alpha","A"
    1,"Whisky","W"
    C'est pas magique, ça ?
    Cordialement
    1
    1. le père
       
      Bonjour,

      En effet, c'est magique. Je plussoie.
      0
  2. le père
     
    Bonjour

    SELECT * FROM TBL WHERE nom='Lima' UNION SELECT * FROM TBL WHERE nom='Alpha' UNION SELECT * FROM TBL WHERE nom='Wisky' UNION SELECT * FROM TBL WHERE nom <> 'Lima' and nom <> 'Alpha' and nom <> 'Wisky'
    0
    1. le père
       
      Je viens de remarquer (j'avais lu trop vite) que tu parlais d'un champ SET.
      Un simple 'ORDER BY' devrait suffire, à condition d'avoir défini le SET dans le bon ordre, évidemment. Si ton SET est déjà défini et que tu ne veux pas le modifier, la requête ci-dessus devrait marcher, elle.
      0
  3. Utilisateur anonyme
     
    Oho ! Je vais tester ça !! Merci d'avoir répondu !
    0
  4. Utilisateur anonyme
     
    Bonjour... Re-bonjour plutôt !
    Java4ever, ta technique est splendide et compréhensible à souhait, mais juste un peu longue. J'ai donc préféré le UNION du père (merci à toi), en mettant entre parenthèses les 3 requêtes SELECT. ORDER BY ne fonctionnait pas, il remettait tout dans l'ordre, non séparément. J'ai donc utilisé GROUP BY est ça marche super !

    Merci à vous deux !
    A bientôt !
    0