Указание собственного порядка сортировки в ORDER BY
Всем известно, что возможно указание порядка сортировки в запросе SQL по значениям поля или полей - по возрастанию значений, по убыванию, уменьшению. Но что, если вдруг необходим собственный порядок сортировки записей? В MySQL возможно указание собственного порядка сортировки записей в ORDER BY. На помощь тут могут прийти 2 функции: FIELD и FIND_IN_SET.
Например, некоторое поле type_name имеет значения: 'one', 'two', 'three'. При обычном способе сортировки ORDER BY type_name получим порядок: 'one', 'three', 'two', что в общем-то не подходит. Но вполне решаемо с помошью следующего запроса:
SELECT * FROM table_name
ORDER BY FIELD(type_name, 'one', 'two' , 'three');
или
SELECT * FROM table_name
ORDER BY FIND_IN_SET(type_name, 'one,two,three');
Описание:
FIELD(str, str1, str2, str3,...)
Returns the index (position) of str in the str1, str2, str3, ... list. Returns 0 if str is not found.
If all arguments to FIELD() are strings, all arguments are compared as strings. If all arguments are numbers, they are compared as numbers. Otherwise, the arguments are compared as double.
If str is NULL, the return value is 0 because NULL fails equality comparison with any value. FIELD() is the complement of ELT().
Returns a value in the range of 1 to N if the string str is in the string list strlist consisting of N substrings. A string list is a string composed of substrings separated by “,” characters. If the first argument is a constant string and the second is a column of type SET, the FIND_IN_SET() function is optimized to use bit arithmetic. Returns 0 if str is not in strlist or if strlist is the empty string. Returns NULL if either argument is NULL. This function does not work properly if the first argument contains a comma (“,”) character.
Всем известно, что возможно указание порядка сортировки в запросе SQL по значениям поля или полей - по возрастанию значений, по убыванию, уменьшению. Но что, если вдруг необходим собственный порядок сортировки записей? В MySQL возможно указание собственного порядка сортировки записей в ORDER BY. На помощь тут могут прийти 2 функции:
FIELD
иFIND_IN_SET.
Например, некоторое поле
type_name
имеет значения: 'one', 'two', 'three'. При обычном способе сортировкиORDER BY type_name
получим порядок: 'one', 'three', 'two', что в общем-то не подходит. Но вполне решаемо с помошью следующего запроса:Описание:
FIELD(str, str1, str2, str3,...)
Returns the index (position) of
str
in thestr1
,str2
,str3
,...
list. Returns0
ifstr
is not found.If all arguments to
FIELD()
are strings, all arguments are compared as strings. If all arguments are numbers, they are compared as numbers. Otherwise, the arguments are compared as double.If
str
isNULL
, the return value is0
becauseNULL
fails equality comparison with any value.FIELD()
is the complement ofELT()
.FIND_IN_SET(
str
,strlist
)Returns a value in the range of 1 to
N
if the stringstr
is in the string liststrlist
consisting ofN
substrings. A string list is a string composed of substrings separated by “,” characters. If the first argument is a constant string and the second is a column of typeSET
, theFIND_IN_SET()
function is optimized to use bit arithmetic. Returns0
ifstr
is not instrlist
or ifstrlist
is the empty string. ReturnsNULL
if either argument isNULL
. This function does not work properly if the first argument contains a comma (“,”) character.