3列のテーブルがあります。
id | name | priority
--------------------
1 | core | 10
2 | core | 9
3 | other | 8
4 | board | 7
5 | board | 6
6 | core | 4
priority
を使用して結果セットを順序付けますが、優先順位が低くても、最初にname=core
を持つ行を並べます。結果は次のようになります
id | name | priority
--------------------
6 | core | 4
2 | core | 9
1 | core | 10
5 | board | 6
4 | board | 7
3 | other | 8
MySQL FIELD
関数 もあります。
すべての可能な値の完全なソートが必要な場合:
SELECT id, name, priority
FROM mytable
ORDER BY FIELD(name, "core", "board", "other")
「コア」が最初であり、他の値が重要でないことだけを気にする場合:
SELECT id, name, priority
FROM mytable
ORDER BY FIELD(name, "core") DESC
最初に「コア」でソートし、他のフィールドを通常のソート順にソートする場合:
SELECT id, name, priority
FROM mytable
ORDER BY FIELD(name, "core") DESC, priority
ただし、ここにはいくつかの注意事項があります。
まず、これはmysqlのみの機能であると確信しています-質問にはmysqlというタグが付いていますが、あなたは決して知りません。
第二に、FIELD()
の動作に注意してください:値の1ベースのインデックスを返します-FIELD(priority, "core")
の場合、1を返します「コア」は値です。フィールドの値がリストにない場合、zeroを返します。これが、すべての可能な値を指定しない限り、DESC
が必要な理由です。
一般的にできること
select * from your_table
order by case when name = 'core' then 1 else 2 end,
priority
特にMySQLでは次のこともできます
select * from your_table
order by name <> 'core',
priority
MySQLでの比較の結果は0
または1
であり、その結果でソートできます。
特定の行を優先する1つの方法は、優先順位に大きな数を追加することです。 CASE
ステートメントを使用してこれを行うことができます。
select id, name, priority
from mytable
order by priority + CASE WHEN name='core' THEN 1000 ELSE 0 END desc
1つの方法は次のとおりです。
select id, name, priority from table a
order by case when name='core' then -1 else priority end asc, priority asc
これは、Postgres 9+を使用している場合に有効です。
SELECT *
FROM your_table
ORDER BY name = 'core' DESC, priority DESC
SELECT * FROM cars_new WHERE status = '1' and car_hide !='1' and cname IN ('Executive Car','Saloon','MPV+','MPV5') ORDER BY FIELD(cname, 'Executive Car', 'Saloon','MPV+','mpv5')
これを行う:
SELECT * FROM table ORDER BY column `name`+0 ASC
+0を追加すると、次のことを意味します。
0, 10, 11, 2, 3, 4
になります:
0, 2, 3, 4, 10, 11