82 votes

Mysql SQL: élément spécifique à être en premier puis trier le reste des éléments

Supposons que j'ai le tableau ci-dessous.

Je veux obtenir tous les amis, mais je veux que l'id 5 soit le premier élément de la liste. Peu m'importe l'ordre dans lequel je reçois le reste des éléments.

Le résultat de la requête souhaité sera :

amis
-------

id    nom

5     nahum
1     moshe
2     haim
3     yusuf
4     gedalia
6     dana

Comment puis-je faire cela ?

en utilisant Mysql 5.1.x.

Merci !

150voto

RichardTheKiwi Points 58121
sélectionnez id, nom
de amis
ordre par id=5 desc, id asc

(étant donné que vous ne vous souciez pas de l'ordre du reste, sinon, p. ex. reste par id asc)

48voto

Dumitrescu Bogdan Points 3264

Essayez ceci :

select id,name 
from friends 
order by case when id=5 then -1 else id end

Si vous en avez plus d'un, vous pouvez faire :

select id,name 
from friends 
order by case when id in (5,15,25) then -1 else id end,id

4voto

Amadan Points 41944

Je ne peux pas accéder à un MySQL maintenant pour tester, donc cela pourrait être inversé... mais vous pouvez utiliser le fait que les booléens se trient également, et que vous pouvez avoir plusieurs champs de tri.

SELECT ... ORDER BY id != 5, id

(vous pourriez avoir à écrire id = 5, je ne me souviens pas si les TRUE se trient avant ou après les FALSE.)

EDIT: Oh, je viens de lire que vous ne vous souciez pas de l'ordre du reste, dans ce cas je recommande vivement la réponse de @Richard.

4voto

jeff9888 Points 275

Vous pouvez utiliser field() dans MySQL.

select id,name from friends order by field(id,5,id)

Le 1er paramètre dans field() signifie le champ avec lequel vous voulez trier, le reste est l'ordonnancement.

Ainsi, 5 sera trié en premier, et le reste à partir de l'id (sans le 5). Vous pouvez faire comme field(id,5,1,3,id) si vous voulez que 5, 1, 3 soient en premier.

5 peut être choisi pour être trié en dernier par field(id,id,5). Le 2ème id excluera également le 5 de lui.

2voto

Ucello Points 112

Si vous voulez faire la même chose pour une requête UNION, par exemple si vous avez :

select id,name 
from friends 
UNION
select id,name 
from friends 
order by id=5 desc

... vous obtiendriez une exception dans PostgreSQL:

Seuls les noms de colonnes de résultat peuvent être utilisés, pas des expressions ou des fonctions. ASTUCE : Ajoutez l'expression/la fonction à chaque SELECT, ou déplacez UNION dans une clause from

Pour contourner cela, vous utiliseriez le suivant :

select id,name, (id=5) AS is_five
from friends 
UNION
select id,name, (id=5) AS is_five
from friends 
order by is_five DESC, id DESC

L'expression (id=5) renverrait 't' OU 'f', en fonction que la valeur de votre colonne est égale ou non à la valeur attendue (5), donc le order by ferait d'abord l'ordre des colonnes 't', puis le reste.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X