web-dev-qa-db-fra.com

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

Disons que j'ai le tableau ci-dessous.

Je veux avoir tous les amis, mais je veux que l'identifiant 5 soit le premier élément de la liste. Je me fiche de la commande que je reçois le reste des articles.

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

friends
-------

id    name

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

Comment puis-je faire ceci?

en utilisant Mysql 5.1.x.

Merci!

66
ufk
select id,name 
from friends 
order by id=5 desc

(étant donné que vous ne vous souciez pas de l'ordre des autres, sinon, par exemple reste par id asc )

select id,name 
from friends 
order by id=5 desc, id asc
125
RichardTheKiwi

Essaye ça:

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

si vous en avez plus que vous pouvez faire:

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

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

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

(Vous devrez peut-être écrire id = 5. Je ne me souviens pas si les VRAIS sont triés avant ou après les FAUX.)

EDIT: Oh, je viens de lire que vous ne vous souciez pas de l'ordre des autres, auquel cas je recommande vivement la réponse de @ Richard.

3
Amadan

Si vous voulez faire la même chose pour la 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 obtiendrez une exception dans PostgreSQL: 

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

Pour résoudre ce problème, utilisez les éléments suivants:

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' OR 'f', selon que la valeur de votre colonne est égale ou non à la valeur attendue (5). Par conséquent, l'ordre suivant serait d'abord ordonné à 't' colonnes, puis le reste.

1
Ucello

Vous devriez utiliser la clause ORDER BY FIELD de MySQL pour résoudre ce problème. Bien que la réponse ait été acceptée, voici une meilleure solution.

select 1 id, 'Zeta' order_col union all
select 2 id, 'Alpha' order_col union all
select 3 id, 'Gamma' order_col union all
select 4 id, 'Phi' order_col union all
select 5 id, 'Delta' order_col union all
select 6 id, 'Delta' order_col union all
select 7 id, 'Alpha' order_col union all
select 8 id, 'Gamma' order_col union all
select 9 id, 'Zeta' order_col union all
select 10 id, 'Phi' order_col 
order by field (order_col, 'Alpha', 'Gamma', 'Phi', 'Delta', 'Zeta'), id;

C'est mieux que 

  • id = quelque chose, ordre par identifiant asc
  • ordre par cas quand quelque chose puis 1 quand quelque chose_else puis 2 fin desc
0
MontyPython

Vous pouvez utiliser field() dans MySQL.

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

Le premier paramètre dans field () indique le champ avec lequel vous souhaitez trier, le reste consiste à ordonner.

Donc 5 seront triés en premier, et le reste de id (sans 5). Vous pouvez faire comme field(id,5,1,3,id) si vous voulez que 5,1,3 soit devant.

5 peuvent être choisis pour trier enfin par field(id,id,5). Le 2ème identifiant en exclura également 5.

0
Jeffrey Neo