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!
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
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
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.
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.
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
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.