最初に特定のフィールド値で並べ替える


91

3列のテーブルがあります。

id | name | priority
--------------------
 1 | core  |   10
 2 | core  |   9
 3 | other |   8
 4 | board |   7
 5 | board |   6
 6 | core  |   4

I want to order the result set using priority but first those rows that have name=core even if have lower priority. The result should look like this

id | name | priority
--------------------
 6 | core  |   4
 2 | core  |   9
 1 | core  |   10
 5 | board |   6
 4 | board |   7
 3 | other |   8

回答:


158

There's also the MySQL FIELD function.

If you want complete sorting for all possible values:

SELECT id, name, priority
FROM mytable
ORDER BY FIELD(name, "core", "board", "other")

If you only care that "core" is first and the other values don't matter:

SELECT id, name, priority
FROM mytable
ORDER BY FIELD(name, "core") DESC

If you want to sort by "core" first, and the other fields in normal sort order:

SELECT id, name, priority
FROM mytable
ORDER BY FIELD(name, "core") DESC, priority

There are some caveats here, though:

First, I'm pretty sure this is mysql-only functionality - the question is tagged mysql, but you never know.

Second, pay attention to how FIELD() works: it returns the one-based index of the value - in the case of FIELD(priority, "core"), it'll return 1 if "core" is the value. If the value of the field is not in the list, it returns zero. This is why DESC is necessary unless you specify all possible values.


5
After about 5 years I changed accepted answer to this one because it's cleaner and faster.
Omid

db2 equivalent?
Cybermonk

It worked for me, would like to ask one more question about how to handle If column 'priority' contains values like ex: 'earth core','new board' etc. Here column not containing an exact value, can we write something like %core%?
Jayanth Suvarna

@JayanthSuvarna: looking at the MySQL FIELD() docs, I am pretty sure there isn't any way to evaluate this as substrings, as each argument has to be some kind of string. There may be some string manipulation functions that could help, but I'm not sure.
Nerdmaster

Thanks, mate. You made my day.
BEingprabhU

92

Generally you can do

select * from your_table
order by case when name = 'core' then 1 else 2 end,
         priority 

Especially in MySQL you can also do

select * from your_table
order by name <> 'core',
         priority 

Since the result of a comparision in MySQL is either 0 or 1 and you can sort by that result.


1
what does 1 and 2 means here?
Niraj Chauhan

1
I've around 3000 rows to sort. In my case the solution of @Ayman-Hourieh on stackoverflow.com/questions/958627/… takes half of the time compared to this solution.
nightlyop

@nightlyop: Good one. Only one note: The faster solution is MySQL-specific.
juergen d

1 and 2 are just 2 numbers I use to sort the data. Could be 3 and 4 or something else.
juergen d

What about when there is % in the WHERE clause? Like . . . WHERE name LIKE '%sth%' . . . ? stackoverflow.com/questions/41303379/…
stack

6

One way to give preference to specific rows is to add a large number to their priority. You can do this with a CASE statement:

  select id, name, priority
    from mytable
order by priority + CASE WHEN name='core' THEN 1000 ELSE 0 END desc

Demo: http://www.sqlfiddle.com/#!2/753ee/1


5

This works for me using Postgres 9+:

SELECT *
FROM your_table
ORDER BY name = 'core' DESC, priority DESC

Care to explain -1? Error + Postgres version?
Vojtech Vitek

3

One way is this:

select id, name, priority from table a
order by case when name='core' then -1 else priority end asc, priority asc

1
Won't this lose the order of the core rows?
mellamokb

1
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')

3
Although your code may be the answer to the question, it's better to provide some explanation about it.
Mehraban

0

do this:

SELECT * FROM table ORDER BY column `name`+0 ASC

Appending the +0 will mean that:

0, 10, 11, 2, 3, 4

becomes :

0, 2, 3, 4, 10, 11

This technique is for turning a string into a number. It does not address the OP's question. (However, without seeing the datatype of priority, I can't say whether it should be part of the complete solution.)
Rick James

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.